ホームページ  >  記事  >  バックエンド開発  >  埋め込み構造体の JSON アンマーシャリングが予期しない動作を引き起こすのはなぜですか?

埋め込み構造体の JSON アンマーシャリングが予期しない動作を引き起こすのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-07 03:12:02688ブラウズ

Why does JSON Unmarshaling of Embedded Structs Lead to Unexpected Behavior?

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。