JSON アンマーシャル埋め込み構造体の探索
JSON オブジェクトを埋め込みフィールドを含む構造体にアンマーシャルしようとすると、予期しない動作が発生する可能性があります。これを説明するために、次の構造体の定義を考えてみましょう。
<code class="go">type Outer struct { Inner Num int } type Inner struct { Data string } func (i *Inner) UnmarshalJSON(data []byte) error { i.Data = string(data) return nil }</code>
json.Unmarshal(data, &Outer{}) を使用して JSON オブジェクトを アウター のインスタンスにアンマーシャリングすると、内部フィールドのみが設定され、 Num フィールドはそのまま残ります。これは、JSON が埋め込みフィールドを非整列化する方法に起因している可能性があります。
この問題を解決するには、埋め込みフィールドを親構造体の明示的なフィールドにすることをお勧めします。この変更により、JSON アンマーシャラーがフィールドに直接アクセスしてアンマーシャリングできるようになります。修正された構造体定義は次のとおりです。
<code class="go">Outer struct { I Inner // make Inner an explicit field Num int `json:"Num"` }</code>
この更新バージョンでは、Inner フィールドは I という名前の明示的なフィールドになります。さらに、Num フィールドには json:"Num" のタグが付けられ、JSON キーが確実に「Num」は、アンマーシャリング中にこのフィールドにマップされます。
このアプローチを採用すると、JSON オブジェクトを アウター のインスタンスにアンマーシャリングするときに、I フィールドと Num フィールドの両方が正しく設定されます。
以上が埋め込み構造体の JSON アンマーシャリングが予期しない動作を引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。