埋め込み型キーを使用した動的 JSON のアンマーシャリング
Go では、JSON データを動的型のフィールドを持つ構造体にアンマーシャリングできます。挑戦的。この記事では、カスタム構造体と埋め込み型キーを利用してこれを実現するソリューションについて説明します。
問題ステートメント
次の JSON 構造を考えてみましょう:
{ "some_data": "foo", "dynamic_field": { "type": "A", "name": "Johnny" }, "other_data": "bar" }
この JSON を、インターフェース型のフィールド DynamicField を持つ Go 構造体にアンマーシャリングしたいと考えています。 何か。 JSON 内の type キーの値に応じて、DynamicField は DynamicTypeA または DynamicTypeB のいずれかに対応する必要があります。
解決策
この問題を解決するには、次のカスタムを定義します。 structs:
type Something interface { GetType() string } type DynamicType struct { Type string `json:"type"` Value interface{} `json:"-"` // Not exported }
DynamicType は動的フィールドを表します。データの実際のタイプを決定するために埋め込まれた Type キー。直接アクセスを防ぐため、Value フィールドはエクスポートされません。
次に、JSON を表す Go 構造体を定義します。
type BigStruct struct { SomeData string `json:"some_data"` DynamicField DynamicType `json:"dynamic_field"` OtherData string `json:"other_data"` }
最後に、DynamicType の UnmarshalJSON メソッドを実装します。
func (d *DynamicType) UnmarshalJSON(data []byte) error { var typ struct { Type string `json:"type"` } if err := json.Unmarshal(data, &typ); err != nil { return err } switch typ.Type { case "A": d.Value = new(DynamicTypeA) case "B": d.Value = new(DynamicTypeB) } return json.Unmarshal(data, d.Value) }
このメソッドは、型キーをアンマーシャリングしてから、適切な構造体を作成します(DynamicTypeA または DynamicTypeB) 値に基づきます。次に、残りの JSON データを作成された構造体にアンマーシャリングし、値フィールドに保存します。
以上がGo で埋め込み型キーを使用して動的 JSON をアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。