Go で Null と存在しない JSON フィールドを区別する
Go では、JSON データを構造体にアンマーシャリングすると、結果として Null フィールドと存在しないフィールドの両方が発生します。結果の構造体の nil 値。これは、フィールドが null である場合は特定の意図を示し、そのフィールドが存在しない場合はフィールドが存在しなかったことを示す場合など、2 つのシナリオを区別することが重要な場合に困難になる可能性があります。
オプションの構造体の使用 (Go 1.18)
Go 1.18 以降では、ジェネリックスによりカスタム構造体を使用した簡単なソリューションが可能になります。オプション[T]。この構造体には、JSON ペイロード内にフィールドが存在することを示す Defined boolean フィールドと、実際の値を含む Value フィールドが組み込まれています。アンマーシャリング時に、値が定義されている (null ではない) 場合、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 に設定します。これにより、null のフィールドと存在しないフィールドを区別できるようになります。
以上がGo で Null フィールドと存在しない JSON フィールドを区別するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。