如何区分 Go 中的 Null 和缺失 JSON 字段?
Dec 01, 2024 pm 01:24 PM区分 Go 中的 Null 和缺失 JSON 字段
在 Go 中,当将 JSON 数据解组到结构体中时,会产生 null 字段和缺失字段结果结构中的 nil 值。当必须区分两种情况时,这可能是一个挑战,例如当字段为空时表示特定意图,而字段不存在则表示它从未存在过。
利用可选结构(Go 1.18 )
对于 Go 1.18 及更高版本,泛型允许使用自定义结构体提供简单的解决方案:可选[T].该结构包含一个 Defined 布尔字段(指示该字段在 JSON 负载中的存在)和一个 Value 字段(包含实际值)。解组时,如果定义了值(不为空),则会调用 UnmarshalJSON,适当设置 Defined 和 Value 字段。
type Optional[T any] struct { Defined bool Value *T }
登录后复制
type Payload struct { Field1 Optional[string] `json:"field1"` Field2 Optional[bool] `json:"field2"` Field3 Optional[int32] `json:"field3"` }
登录后复制
通过检查 Defined 字段,您可以辨别字段是否为null 或未定义。
自定义解组器Pre-Generics
在 Go 1.18 之前,可以使用自定义 Unmarshaler 来实现此目的:
type OptionalString struct { Defined bool Value *string } func (os *OptionalString) UnmarshalJSON(data []byte) error { // UnmarshalJSON is called only if the key is present os.Defined = true return json.Unmarshal(data, &os.Value) }
登录后复制
type Payload struct { SomeField1 string `json:"somefield1"` SomeField2 OptionalString `json:"somefield2"` }
登录后复制
在这种方法中,OptionalString 结构体实现了 json. Unmarshaler 接口,当该字段存在于 JSON 负载中时,将 Defined 设置为 true。这样可以区分空字段和不存在字段。
以上是如何区分 Go 中的 Null 和缺失 JSON 字段?的详细内容。更多信息请关注PHP中文网其他相关文章!
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章
仓库:如何复兴队友
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
击败分裂小说需要多长时间?
3 周前
By DDD
Hello Kitty Island冒险:如何获得巨型种子
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前
By 尊渡假赌尊渡假赌尊渡假赌
公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验?
3 周前
By 王林

热门文章
仓库:如何复兴队友
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
击败分裂小说需要多长时间?
3 周前
By DDD
Hello Kitty Island冒险:如何获得巨型种子
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前
By 尊渡假赌尊渡假赌尊渡假赌
公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验?
3 周前
By 王林

热门文章标签

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)