Go でカスタム UnmarshalJSON を使用して埋め込み構造体を処理する方法

Barbara Streisand
リリース: 2024-11-04 14:29:02
オリジナル
205 人が閲覧しました

How to Handle Embedded Structs with Custom UnmarshalJSON in Go?

エラー処理: 埋め込み構造体のカスタム アンマーシャル

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート