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{}) を使用すると、Num フィールドは無視されます。なぜこれが起こっているのでしょうか?
この問題は、インナーをアウターに埋め込むことに起因しています。 JSON ライブラリがアウターで UnmarshalJSON を呼び出すと、誤ってインナーで UnmarshalJSON を呼び出してしまいます。したがって、 func (i *Inner) UnmarshalJSON(data []byte) の data 引数には JSON 文字列全体が含まれており、これは Inner に対してのみ処理されます。
この問題を解決するには、Inner を明示的に指定する必要があります。外側のフィールド:
<code class="go">Outer struct { I Inner // make Inner an explicit field Num int `json:"Num"` }</code>
正しいアプローチを示す例は次のとおりです:
<code class="go">package main import ( "encoding/json" "fmt" ) type Outer struct { I Inner `json:"I"` Num int `json:"Num"` } type Inner struct { Data string `json:"data"` } func (i *Inner) UnmarshalJSON(data []byte) error { i.Data = string(data) return nil } func main() { jsonStr := `{"I": "hello", "Num": 123}` var outer Outer err := json.Unmarshal([]byte(jsonStr), &outer) if err != nil { fmt.Println(err) } fmt.Println(outer) }</code>
以上がJSON データを埋め込み構造体を含む構造体にアンマーシャリングするときに Num フィールドが無視されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。