ホームページ > バックエンド開発 > Golang > Go で Null フィールドと存在しない JSON フィールドを区別するにはどうすればよいですか?

Go で Null フィールドと存在しない JSON フィールドを区別するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-01 13:24:12
オリジナル
167 人が閲覧しました

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

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート