型キーに基づいて動的 JSON をアンマーシャリングする
JSON 構造に動的フィールドが含まれる場合、複雑な JSON データを Go 構造体にアンマーシャリングするのは困難になる場合がありますさまざまな種類の。この記事では、JSON フィールドが主に単純な値を保持しますが、場合によっては特定の型キーを持つ動的フィールドによってフィールドの値の型が決定されるという特定のシナリオについて説明します。
目標は、同じ値を持つ Go 構造体を作成することです。構造は提供された JSON として使用され、動的フィールドはインターフェイス タイプとして表され、そのタイプに基づいた柔軟な処理が可能になります。
考えられる解決策の 1 つは、次のカスタムを利用します。タイプ:
type BigStruct struct { SomeData string `json:"some_data"` DynamicField Something `json:"dynamic_field"` OtherData string `json:"other_data"` } type Something interface { GetType() string }
次に、動的フィールドのタイプごとに個別の構造体を作成します:
type BaseDynamicType struct { Type string `json:"type"` } type DynamicTypeA struct { BaseDynamicType Name string `json:"name"` } type DynamicTypeB struct { BaseDynamicType Address string `json:"address"` } func (d *BaseDynamicType) GetType() string { return d.Type }
JSON をこの構造体にアンマーシャリングするために、BigStruct はカスタム UnmarshalJSON メソッドを実装できます:
func (b *BigStruct) UnmarshalJSON(data []byte) error { var tmp struct { SomeData string `json:"some_data"` DynamicField json.RawMessage `json:"dynamic_field"` OtherData string `json:"other_data"` } if err := json.Unmarshal(data, &tmp); err != nil { return err } b.Unmarshal(tmp.DynamicField) return nil }
Unmarshal メソッドは、UnmarshalJSON 内から呼び出すことができます。動的フィールドを解析します:
func (b *BigStruct) Unmarshal(data json.RawMessage) error { switch UnmarshalledType(data) { case "A": var a DynamicTypeA if err := json.Unmarshal(data, &a); err != nil { return err } b.DynamicField = &a case "B": var b DynamicTypeB if err := json.Unmarshal(data, &b); err != nil { return err } b.DynamicField = &b } return nil } func UnmarshalledType(b json.RawMessage) string { var typ struct { Type string `json:"type"` } if err := json.Unmarshal(b, &typ); err != nil { log.Fatalf("Error extracting type from RawMessage: %v", err) } return typ.Type }
このアプローチを使用すると、追加のプレースホルダー フィールドを導入せずに、動的 JSON フィールドを Go 構造体にアンマーシャリングできます。
以上がGo で型キーに基づいて動的 JSON フィールドをアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。