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

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

Barbara Streisand
發布: 2024-12-05 08:57:09
原創
781 人瀏覽過

How to Differentiate Between Null and Absent JSON Fields in Go?

區分設定為空的JSON 欄位和不存在的欄位

將JSON 解組到Go 結構體時,辨別欄位是空還是不存在可能是個挑戰。這兩種情況都會導致結構體中出現 nil 值,很難確定該欄位的原始存在。

為了解決這個問題,讓我們探索兩個解決方案:

1.使用泛型(Go 1.18 )

Go 1.18 引入了泛型,允許我們創建一個通用結構來追蹤JSON值的存在:

type Optional[T any] struct {
    Defined bool
    Value   *T
}
登入後複製

這個可選結構使用 Defined欄位來指示該值是否存在於 JSON 負載中。當此欄位存在時,值欄位會保存未編組的值。透過將此結構合併到您自己的結構中,您可以區分null 和缺失欄位:

type Payload struct {
    Field1 Optional[string] `json:"field1"`
    Field2 Optional[bool]   `json:"field2"`
    Field3 Optional[int32]  `json:"field3"`
}
登入後複製

2.自訂類型(預泛型)

在泛型之前,我們可以建立一個自訂類型來處理可選值:

type OptionalString struct {
    Defined bool
    Value   *string
}
登入後複製

此類型包括一個Defined欄位來指示存在和一個用於保存未編組字串的值欄位。透過為您需要處理的每種類型定義自訂類型(例如,整數的OptionalInt),您可以保留有關欄位存在的資訊。

範例:

考慮以下 JSON有效負載:

{
  "somefield1":"somevalue1",
  "somefield2":null
}
登入後複製
{
  "somefield1":"somevalue1",
}
登入後複製

使用我們的解決方案,我們可以區分在這些情況之間:

p1 := Payload{}
_ = json.Unmarshal([]byte(`{
            "somefield1": "somevalue1",
            "somefield2": null
        }`), &p1)

fmt.Printf("Should be defined == true and value == nil: \n%+v\n\n", p1)
登入後複製

輸出:

Should be defined == true and value == nil: 
{SomeField1:somevalue1 SomeField2:{Defined:true Value:<nil>}}
登入後複製
p2 := Payload{}
_ = json.Unmarshal([]byte(`{
            "somefield1": "somevalue1",
        }`), &p2)

fmt.Printf("Should be defined == false: \n%+v\n\n", p2)
登入後複製

輸出:

Should be defined == false: 
{SomeField1:somevalue1 SomeField2:{Defined:false Value:<nil>}}
登入後複製

這些範例演示了我們的解決方案如何區分空和不存在JSON字段,在反序列化過程中提供有價值的資訊。

以上是如何區分 Go 中的 Null 和缺失 JSON 欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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