json常见问题汇总

Posted Go语言小黑板

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了json常见问题汇总相关的知识,希望对你有一定的参考价值。

本文解答json包使用中几个常见问题:

为什么字段没有被编码

"omitempty"标签的作用、

如何自定义编解码格式、

如何让json的输出更可读?

每个解答后,会有具体的示例,以节省大家重复试验的时间。


问: 为什么某个字段没被编码

答: 这个或许是最常见的问题了,原因通常是字段没大写。


如果结构体的字段以大写字母开头,那么该字段就是包外可见的(exported)。json包也遵循这一原则,只编码/解码包外可见的字段。比如下图中,Person.age字段,就不会被编码。

json常见问题汇总

: "omitempty"标签的作用是什么

答: "omitempty"即在编码时忽略空白值。


当用omitempty标签指定一个字段时,如果字段是空值,那么json将在编码中忽略该字段。

根据字段类型的不同,空值可以是false、0、空指针、空interface、空字符串以及各类空数组、slice、map。

下图中,如果Person.Job是空指针,则不会被编码。

json常见问题汇总

问:怎样自定义编码/解码的格式

答: 结构体通过实现(Un)MarshalJSON函数来自定义格式。


比如一个人的出生年月日"1998-10-07",如果直接unmarshal,会提示出错: parsing time ""1998-10-07"" as ""2006-01-02T15:04:05Z07:00"": cannot parse """ as "T"原因是time.Time的编解码是按照RFC 3339标准,而出生年月日只精确到日期。

所以我们需要自己实现UnMarshalJSON函数,自己处理传入的数据b: 首先去掉前后的双引号,然后把字符串通过"2006-01-02"的格式处理成time.Time类型,然后再转换成自定义的Birth类型。

json常见问题汇总
json常见问题汇总

问: 如何让json的输出更可读?

答: 使用json.MarshalIndent(v, "", "\t")。


json包提供了MarshalIndent(v interface{}, prefix, indent string)函数。可以指定每一行的前缀preifx和键值对之间的缩进indent。

如下图,使用"\t" (tab)作为缩进字符,使json字符串更可读。

json常见问题汇总
json常见问题汇总

这里的缩进对于嵌套结构也同样适用。如下例中,为Person结构体添加Job嵌套结构之后,json输出的可读性依然不错。

json常见问题汇总

了解更多Go语言知识


以上是关于json常见问题汇总的主要内容,如果未能解决你的问题,请参考以下文章

如何对 json 数组进行分组并每周汇总其总数?

博客网站项目部署问题汇总

使用AngularJs制作页面知识点汇总一:String类型和JSON相互转换

web开发一些常遇到的问题汇总

5种处理js跨域问题方法汇总

第2坑:全局配置文件 app.json 常见错误汇总