區分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中文網其他相關文章!