区分 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中文网其他相关文章!