首頁 > 後端開發 > Golang > 如何區分 Go 中的 Null 和缺失 JSON 欄位?

如何區分 Go 中的 Null 和缺失 JSON 欄位?

Susan Sarandon
發布: 2024-12-01 13:24:12
原創
166 人瀏覽過

How Can I Differentiate Between Null and Absent JSON Fields in Go?

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板