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