JSON データを埋め込み構造体を含む構造体にアンマーシャリングするときに Num フィールドが無視されるのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-04 21:18:02
オリジナル
178 人が閲覧しました

Why is the Num field ignored when unmarshalling JSON data into a struct containing an embedded struct?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!