首页 >后端开发 >Golang >在 Go 中解组时如何区分 JSON 空值和缺失字段?

在 Go 中解组时如何区分 JSON 空值和缺失字段?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-03 21:03:17454浏览

How Can I Distinguish Between JSON Null and Missing Fields When Unmarshaling in Go?

区分在解组期间设置为 Null 和不存在的 JSON 字段

将 JSON 解组到 Golang 结构体时,区分设置为 null 的字段不存在的字段可能至关重要。这两种情况都会导致结构体中出现 nil 值,从而模糊了预期的语义。

使用泛型进行区分 (Go 1.18 )

Go 1.18 引入了泛型,通过以下方式实现了简洁的解决方案单个泛型类型:

type Optional[T any] struct {
    Defined bool
    Value   *T
}

此类型封装了具有已定义字段状态(已定义)的可选值的概念。

用法示例:

type Payload struct {
    Field1 Optional[string] `json:"field1"`
    Field2 Optional[int]   `json:"field2"`
}

解组后,具有已定义值的字段 (已定义 == true )可以区分空值(Value == nil)和缺失值(Defined == false)。

预泛型解决方案

自定义类型包装器:

type OptionalString struct {
    Defined bool
    Value   *string
}

func (os *OptionalString) UnmarshalJSON(data []byte) error {
    os.Defined = true
    return json.Unmarshal(data, &os.Value)
}

示例用法:

type Payload struct {
    Field1 string         `json:"field1"`
    Field2 OptionalString `json:"field2"`
}

限制:

  • 每个支持的类型都需要一个专用的结构包装器(例如,数字类型的OptionalNumber)。
  • 没有提供null和missing之间的全面区分价值观。

以上是在 Go 中解组时如何区分 JSON 空值和缺失字段?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn