Unmarshalling von JSON in Structs vs. Interfaces
In Go bietet das Paket „encoding/json“ Funktionen zum Konvertieren von JSON-Daten in und aus Go-Werten . Beim Unmarshalling von JSON in eine Struktur ist es wichtig zu verstehen, dass das Paket explizite Anweisungen zum Zieltyp erfordert.
Standardmäßig wählt das Paket beim Unmarshalling von JSON in eine Schnittstelle einen geeigneten Typ basierend auf der Datenstruktur aus. Für JSON-Objekte wird „map[string]interface{}“ und für JSON-Arrays „[]interface{}“ ausgewählt. Dieses Verhalten unterscheidet sich jedoch beim Umgang mit Strukturen.
Um JSON in eine bestimmte Struktur zu entmarshalieren, müssen Sie einen Zeiger auf die Struktur als zweiten Parameter von json.Unmarshal() übergeben. Dies liegt daran, dass Go Zeiger automatisch dereferenziert, wenn sie an Funktionen übergeben werden.
Wenn Sie jedoch versuchen, JSON in eine Interface{}-Variable zu entmarshalieren, die einen Nicht-Zeiger-Strukturwert enthält, hat das Paket keine Möglichkeit, den beabsichtigten Wert zu ermitteln Zieltyp. Stattdessen werden die Daten je nach Struktur als Karte oder Slice interpretiert.
Um dieses Problem zu beheben, sollten Sie Ihren Strukturwert mithilfe einer Zeigerreferenz in eine Schnittstelle{} einschließen. Dadurch wird sichergestellt, dass json.Unmarshal über die notwendigen Informationen zum Unmarshalieren in den entsprechenden Typ verfügt:
func getFoo() interface{} { return &Foo{"bar"} // Use a pointer wrapper }
Hier ist eine verbesserte Version des Beispielcodes:
package main import ( "encoding/json" "fmt" ) type Foo struct { Bar string `json:"bar"` } func getFoo() interface{} { return &Foo{"bar"} } func main() { fooInterface := getFoo() myJSON := `{"bar":"This is the new value of bar"}` jsonBytes := []byte(myJSON) err := json.Unmarshal(jsonBytes, fooInterface ) if err != nil { fmt.Println(err) } fmt.Printf("%T %+v", fooInterface, fooInterface) }
Dieser aktualisierte Code wird erfolgreich gedruckt die nicht gemarshallte Foo-Struktur mit dem aktualisierten „bar“-Wert.
Das obige ist der detaillierte Inhalt vonGehen Sie zum JSON-Unmarshalling: Strukturen vs. Schnittstellen – Wann sollten Zeiger verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!