json常见问题汇总
Posted Go语言小黑板
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了json常见问题汇总相关的知识,希望对你有一定的参考价值。
本文解答json包使用中几个常见问题:
为什么字段没有被编码、
"omitempty"标签的作用、
如何自定义编解码格式、
如何让json的输出更可读?
每个解答后,会有具体的示例,以节省大家重复试验的时间。
问: 为什么某个字段没被编码
答: 这个或许是最常见的问题了,原因通常是字段没大写。
如果结构体的字段以大写字母开头,那么该字段就是包外可见的(exported)。json包也遵循这一原则,只编码/解码包外可见的字段。比如下图中,Person.age字段,就不会被编码。
问: "omitempty"标签的作用是什么
答: "omitempty"即在编码时忽略空白值。
当用omitempty标签指定一个字段时,如果字段是空值,那么json将在编码中忽略该字段。
根据字段类型的不同,空值可以是false、0、空指针、空interface、空字符串以及各类空数组、slice、map。
下图中,如果Person.Job是空指针,则不会被编码。
问:怎样自定义编码/解码的格式
答: 结构体通过实现(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.MarshalIndent(v, "", "\t")。
json包提供了MarshalIndent(v interface{}, prefix, indent string)函数。可以指定每一行的前缀preifx和键值对之间的缩进indent。
如下图,使用"\t" (tab)作为缩进字符,使json字符串更可读。
这里的缩进对于嵌套结构也同样适用。如下例中,为Person结构体添加Job嵌套结构之后,json输出的可读性依然不错。
了解更多Go语言知识
以上是关于json常见问题汇总的主要内容,如果未能解决你的问题,请参考以下文章