Unmarshaling von dynamischem JSON mit einem eingebetteten Typschlüssel
In Go kann das Unmarshaling von JSON-Daten in eine Struktur mit einem Feld eines dynamischen Typs erfolgen herausfordernd. In diesem Artikel wird eine Lösung untersucht, die benutzerdefinierte Strukturen und einen eingebetteten Typschlüssel nutzt, um dies zu erreichen.
Problemstellung
Bedenken Sie die folgende JSON-Struktur:
{ "some_data": "foo", "dynamic_field": { "type": "A", "name": "Johnny" }, "other_data": "bar" }
Wir möchten diesen JSON in eine Go-Struktur entmarshalieren, die ein Feld „DynamicField“ eines Schnittstellentyps „Something“ enthält. Abhängig vom Wert des Typschlüssels im JSON sollte DynamicField entweder DynamicTypeA oder DynamicTypeB entsprechen.
Lösung
Um dieses Problem zu lösen, definieren wir den folgenden Brauch structs:
type Something interface { GetType() string } type DynamicType struct { Type string `json:"type"` Value interface{} `json:"-"` // Not exported }
DynamicType stellt das dynamische Feld dar, wobei der Type-Schlüssel eingebettet ist, um den tatsächlichen Typ des zu bestimmen Daten. Das Wertfeld wird nicht exportiert, um direkten Zugriff zu verhindern.
Als nächstes definieren wir die Go-Struktur zur Darstellung des JSON:
type BigStruct struct { SomeData string `json:"some_data"` DynamicField DynamicType `json:"dynamic_field"` OtherData string `json:"other_data"` }
Schließlich implementieren wir die UnmarshalJSON-Methode für DynamicType:
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) }
Diese Methode entpackt den Typschlüssel und erstellt dann eine entsprechende Struktur (DynamicTypeA oder DynamicTypeB). auf den Wert. Anschließend werden die verbleibenden JSON-Daten in die erstellte Struktur entmarshmiert, die dann im Feld „Wert“ gespeichert wird.
Das obige ist der detaillierte Inhalt vonWie entmarshaliere ich dynamisches JSON mit einem eingebetteten Typschlüssel in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!