JSON を Go 構造体にアンマーシャリングする場合、フィールドが Null であるか単に存在しないかを識別することが困難になる場合があります。どちらのシナリオでも、構造体内で nil 値が発生するため、フィールドの元の存在を判断することが困難になります。
この問題に対処するために、次の 2 つの解決策を検討してみましょう。
1.ジェネリックスの使用 (Go 1.18 )
Go 1.18 ではジェネリックスが導入され、JSON 値の存在を追跡するジェネリック構造体を作成できるようになりました。
type Optional[T any] struct { Defined bool Value *T }
このオプションの構造体は、定義済みの構造体を使用します。フィールドに値が JSON ペイロードに存在するかどうかを示します。このフィールドが存在する場合、Value フィールドには非マーシャリング値が保持されます。この構造体を独自の構造体に組み込むことで、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 }
このタイプには、存在を示す定義済みフィールドと、非マーシャリング文字列を保持する値フィールド。処理する必要がある型ごとにカスタム型を定義することで (整数の 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>}}
これらの例は、ソリューションがどのように機能するかを示しています。 null フィールドと存在しない JSON フィールドを区別できるため、逆シリアル化中に貴重な情報が得られます。
以上がGo で Null フィールドと存在しない JSON フィールドを区別するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。