ジェネリック フィールドを導入せずに型キーに基づいて動的 JSON をアンマーシャリングする
多くの構造化 JSON データは Go 構造体にアンマーシャリングする必要があり、多くの場合、ネストされたフィールドが含まれますさまざまなデータ型を使用します。ネストされたフィールドのデータ型が JSON 内の型キーに基づいて異なる場合、カスタム フィールドを使用した従来のアンマーシャリング方法では、不必要なボイラープレート コードが発生する可能性があります。
これに関連して、次の JSON 仕様を考えてみましょう。
{ "some_data": "foo", "dynamic_field": { "type": "A", "name": "Johnny" }, "other_data": "bar" }
と
{ "some_data": "foo", "dynamic_field": { "type": "B", "address": "Somewhere" }, "other_data": "bar" }
これらの JSON ドキュメントは両方とも、同じ Go 構造体:
type BigStruct struct { SomeData string `json:"some_data"` DynamicField Something `json:"dynamic_field"` OtherData string `json:"other_data"` }
課題は、'dynamic_field' オブジェクト内の 'type' キーに基づいて動的データを収容できる 'Something' 型を定義することにあります。
回避するには明示的な「汎用」フィールド (値、データなど) が必要な場合は、型埋め込みの力を活用できます。
type BigStruct struct { SomeData string `json:"some_data"` DynamicField DynamicType `json:"dynamic_field"` OtherData string `json:"other_data"` } type DynamicType struct { Value interface{} }
「DynamicType」内の「Value」フィールドは、JSON の「type」キーに基づいて、任意のタイプのデータを保持できます。適切なアンマーシャリングを容易にするために、「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(TypeA) case "B": d.Value = new(TypeB) } return json.Unmarshal(data, d.Value) }
さまざまなタイプのデータに特定のタイプを定義します。
type TypeA struct { Name string `json:"name"` } type TypeB struct { Address string `json:"address"` }
このアプローチでは、次のことができます。追加の汎用フィールドを必要とせずに JSON ドキュメントをアンマーシャリングし、クリーンで拡張可能なデータを維持できるようにします。構造。
以上がジェネリックフィールドを使用せずに型キーに基づいてGoで動的JSONをアンマーシャリングする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。