「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go でカスタム UnmarshalJSON を使用して埋め込み構造体を処理する方法

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

2024 年 11 月 9 日に公開
ブラウズ:738

How to Handle Embedded Structs with Custom UnmarshalJSON in Go?

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

Go では、埋め込みフィールドを含む構造体に JSON データをアンマーシャリングするときに、埋め込み構造体がその構造体を定義している場合に問題が発生する可能性があります。独自の UnmarshalJSON メソッド。これは、JSON ライブラリが埋め込み構造体の UnmarshalJSON を呼び出し、含まれる構造体で定義されたフィールドを無視するためです。

ケース スタディ

次の構造体の定義を考えてみましょう:

type Outer struct {
    Inner
    Num int
}

type Inner struct {
    Data string
}

func (i *Inner) UnmarshalJSON(data []byte) error {
    i.Data = string(data)
    return nil
}

json.Unmarshal(data, &Outer{}) を使用して JSON を Outer にアンマーシャリングすると、Inner フィールドは UnmarshalJSON メソッドをトリガーし、JSON 文字列全体を消費します。これにより、Outer の Num フィールドが無視されます。

解決策: Explicit Field

この問題を解決するには、埋め込み構造体 Inner を、Outer:

type Outer struct {
    I Inner // make Inner an explicit field
    Num int `json:"Num"`
}

Inner を明示的なフィールドにすることで、JSON ライブラリがデータを Num フィールドなどの Outer の適切なフィールドにアンマーシャリングするようになります。

Example

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
}
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3