【问题标题】:Go lang json.Marshall() ignores omitempty in ByteArray FieldsGolang json.Marshal() 忽略 ByteArray 字段中的省略
【发布时间】:2015-12-01 16:19:47
【问题描述】:

请看下文。

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。

现在,要获得期望值,我们应该怎么做?

【问题讨论】:

标签: json go


【解决方案1】:

几个选项:

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

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

【讨论】:

    【解决方案2】:

    您必须将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

    【讨论】:

    • 可爱的答案。感谢您创建 Playground。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多