Unmarshaling von JSON in konkrete Strukturen
Bei der Arbeit mit komplexen Datenstrukturen ist es oft notwendig, JSON in eine konkrete Struktur statt in eine Schnittstelle zu entmarshaling . Das Standardverhalten von json.Unmarshal besteht jedoch darin, die JSON-Daten in eine Karte zu konvertieren, wenn das Ziel eine Schnittstelle ist.
Problemerklärung
Im bereitgestellten Beispiel Die getFoo-Funktion gibt einen interface{}-Wert zurück, der eine konkrete Foo-Struktur umschließt. Wenn json.Unmarshal mit diesem Wert aufgerufen wird, wird eine Karte erstellt, anstatt die zugrunde liegende Foo-Struktur zu verwenden, da der Typ interface{} allein nicht genügend Informationen für das Unmarshaling bereitstellt.
Lösung: Explizit übergeben Strukturreferenz
Um dieses Problem zu beheben, ist es notwendig, explizit einen Zeiger auf die konkrete Struktur zu übergeben json.Unmarshal. Dadurch wird sichergestellt, dass der Decoder den richtigen Strukturtyp identifizieren kann:
func getFoo() interface{} { return &Foo{"bar"} }
Durch die Rückgabe eines Zeigers auf die Struktur enthält der Interface{}-Wrapper nun einen Verweis auf den konkreten Typ, sodass json.Unmarshal den entmarshalieren kann Daten korrekt.
Hinweis:
Es ist wichtig zu beachten, dass diese Lösung gilt, wenn Der spezifische Strukturtyp ist zur Kompilierungszeit nicht bekannt. Wenn der Strukturtyp bekannt ist, ist es für eine bessere Typsicherheit und Leistung vorzuziehen, ihn direkt an json.Unmarshal zu übergeben.
Das obige ist der detaillierte Inhalt vonWie entmarshaliere ich JSON in konkrete Strukturen in Go, wenn ich „interface{}' verwende?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!