Go lang json.Marshall()忽略了ByteArray Fields中的omitempty

时间:2015-12-01 16:19:47

标签: json go

请参阅下文。

https://play.golang.org/p/HXrqLqYIgz

我的期望值是:

{"Byte2":0,"Name":"bob"}

但实际:

{"ByteArray":[0,0,0,0],"Byte2":0,"Name":"bob"}

根据文件(https://golang.org/pkg/encoding/json/

  

空值为false,0,任何nil指针或接口值,以及长度为零的任何数组,切片,映射或字符串。

因此,json.Marshall()忽略omitempty-tag,因为[0 0 0 0]不是零长度,也不是0也不是nil。

现在,为了获得预期的价值,我们该怎么做?

2 个答案:

答案 0 :(得分:4)

一些选择:

  1. 使A类型的实例具有自己的MarshalJSON方法并实现您想要的行为(例如,如果所有值都为零,则不包括ByteArray

  2. 更改ByteArray的类型。 []byte可以正常工作,因为它默认为空切片,*[4]byte可以正常工作,因为它默认为nil。包括指针是处理仅在序列化中有时存在的字段的常用方法。当然,这确实需要更多的空间,更多的间接性以及更多的GC工作。

答案 1 :(得分:1)

您必须使ByteArray切片或指向数组的指针:

type A struct {
    ByteArray *[4]byte `json:",omitempty"`
    Byte1     byte     `json:",omitempty"`
    Byte2     byte
    Name      string `json:",omitempty"`
}

游乐场:https://play.golang.org/p/nYBqGrSA1L