Unmarshalieren von dynamischem JSON basierend auf einem Typschlüssel
Das Unmarshaling komplexer JSON-Daten in eine Go-Struktur kann eine Herausforderung sein, wenn die JSON-Struktur dynamische Felder enthält unterschiedlicher Art. Dieser Artikel befasst sich mit einem bestimmten Szenario, in dem die JSON-Felder hauptsächlich einfache Werte enthalten, aber gelegentlich ein dynamisches Feld mit einem bestimmten Typschlüssel den Typ des Feldwerts bestimmt.
Das Ziel besteht darin, eine Go-Struktur damit zu erstellen Struktur wie das bereitgestellte JSON, wobei das dynamische Feld als Schnittstellentyp dargestellt wird, was eine flexible Handhabung basierend auf seinem Typ ermöglicht.
Eine mögliche Lösung nutzt den folgenden Brauch Typen:
type BigStruct struct { SomeData string `json:"some_data"` DynamicField Something `json:"dynamic_field"` OtherData string `json:"other_data"` } type Something interface { GetType() string }
Dann erstellen Sie individuelle Strukturen für jeden dynamischen Feldtyp:
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 }
Um den JSON in dieser Struktur zu entmarshalieren, kann BigStruct eine benutzerdefinierte UnmarshalJSON-Methode implementieren:
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 }
Die Unmarshal-Methode kann aus UnmarshalJSON heraus aufgerufen werden, um die Dynamik zu analysieren Feld:
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 }
Mit diesem Ansatz können Sie dynamische JSON-Felder in der Go-Struktur entmarshalieren, ohne ein zusätzliches Platzhalterfeld einzuführen.
Das obige ist der detaillierte Inhalt vonWie entmarshaliere ich dynamische JSON-Felder in Go basierend auf einem Typschlüssel?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!