请参阅下文。
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。
现在,为了获得预期的价值,我们该怎么做?
答案 0 :(得分:4)
一些选择:
使A
类型的实例具有自己的MarshalJSON
方法并实现您想要的行为(例如,如果所有值都为零,则不包括ByteArray
)
更改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"`
}