为了账号安全,请及时绑定邮箱和手机立即绑定

误解如何使用 MarshalJSON

误解如何使用 MarshalJSON

Go
拉莫斯之舞 2022-05-23 18:06:02
我有一个相当不寻常的情况。我希望 MarshalJSON 有条件地省略一个结构字段。在下面的示例中,想法是省略B Bool字段 if的输出B.Value == B.Undefined。type Bool struct {    // Current value    Value bool    // Value if undefined    Undefined bool}func (b Bool) MarshalJSON() ([]byte, error) {    if b.Value == b.Undefined {        return []byte{}, nil    } else if b.Value {        return ([]byte)("true"), nil    }    return ([]byte)("false"), nil}func main() {    var example = struct {        N int  `json:"foo"`        B Bool `json:"value,omitempty"`    }    example.B = Bool{true, true}    output, err := json.Marshal(example)    if err != nil {        panic(err)    }    fmt.Println(string(output))}根据文档:“omitempty”选项指定如果字段具有空值(定义为 false、0、nil 指针、nil 接口值以及任何空数组、切片、映射或字符串),则应从编码中省略该字段。我返回一个空字节切片,这会导致错误:panic: json: error calling MarshalJSON for type main.Bool: unexpected end of JSON inputgoroutine 1 [running]:main.main()    /tmp/sandbox933539113/prog.go:32 +0x160如果我设置example.B = Bool{false, true},那么它会打印结果,但该字段仍然没有被省略,尽管"false"从Bool.MarshalJSON. 我究竟做错了什么?具有满足Marshaler接口的类型的值是否有效地忽略了省略标记条目?
查看完整描述

1 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

 if b.Value == b.Undefined {

        return []byte{}, nil

产生无效的 JSON:它返回 0 个字节。您的MarshalJSON方法必须返回有效的 JSON,这意味着它必须返回something。


如果您的目标是完全忽略该字段,则在未设置时,请使用指针,并且不要设置它:


func main() {

    var example = struct {

        N int   `json:"foo"`

        B *Bool `json:"value,omitempty"`

    }

    example.B = Bool{N: true, B: nil}

    output, err := json.Marshal(example)

    if err != nil {

        panic(err)

    }

    fmt.Println(string(output))

}

如果您想在 的值为Bool特定值时完全省略该字段,则必须MarshalJSON在包含结构上定义您的方法,以便它可以在需要时正确省略该字段。


查看完整回答
反对 回复 2022-05-23
  • 1 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信