Go では、埋め込みフィールドを含む構造体に JSON データをアンマーシャリングするときに、埋め込み構造体がその構造体を定義している場合に問題が発生する可能性があります。独自の UnmarshalJSON メソッド。これは、JSON ライブラリが埋め込み構造体の UnmarshalJSON を呼び出し、含まれる構造体で定義されたフィールドを無視するためです。
次の構造体定義を考えてみましょう:
<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 を Outer にアンマーシャリングすると、Inner フィールドは UnmarshalJSON メソッドをトリガーし、JSON 文字列全体を消費します。これにより、Outer の Num フィールドが無視されます。
この問題を解決するには、埋め込まれた構造体 Inner を、Outer:
<code class="go">type Outer struct { I Inner // make Inner an explicit field Num int `json:"Num"` }</code>
Inner を明示的なフィールドにすることで、JSON ライブラリがデータを Num フィールドを含むアウターの適切なフィールドにアンマーシャリングするようになります。
<code class="go">import ( "encoding/json" "fmt" ) type Outer struct { I Inner // make Inner an explicit field Num int `json:"Num"` } type Inner struct { Data string } func (i *Inner) UnmarshalJSON(data []byte) error { i.Data = string(data) return nil } func main() { data := []byte(`{"Data": "Example", "Num": 42}`) var outer Outer err := json.Unmarshal(data, &outer) if err != nil { fmt.Println(err) } fmt.Println(outer.I.Data, outer.Num) // Output: Example 42 }</code>
以上がGo でカスタム UnmarshalJSON を使用して埋め込み構造体を処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。