Beim Unmarshaling von JSON-Daten mit json.Unmarshal ist es wichtig, einen konkreten Typ für die Zielvariable anzugeben, um unerwartete Konvertierungen zu vermeiden.
In Ihrem bereitgestellten Code definieren Sie eine Funktion getFoo(), die eine Schnittstelle zurückgibt, die eine Foo-Struktur enthält. Wenn Sie diese Schnittstelle an json.Unmarshal senden, interpretiert es den Wert als Karte und nicht als konkrete Struktur.
Um dieses Problem zu beheben, können Sie entweder einen Zeiger auf die konkrete Struktur innerhalb der Schnittstelle übergeben oder die angeben konkreter Strukturtyp direkt in json.Unmarshal.
Hier ist ein Beispiel mit a Zeiger:
func getFoo() interface{} { return &Foo{"bar"} } func main() { fooInterface := getFoo() jsonBytes := []byte(`{"bar":"This is the new value of bar"}`) err := json.Unmarshal(jsonBytes, fooInterface) if err != nil { fmt.Println(err) } fmt.Println(fooInterface) // *main.Foo &{Bar:This is the new value of bar} }
Alternativ können Sie die Typzusicherung verwenden, um den konkreten Typ anzugeben:
func main() { fooInterface := getFoo() jsonBytes := []byte(`{"bar":"This is the new value of bar"}`) foo := fooInterface.(*Foo) err := json.Unmarshal(jsonBytes, foo) if err != nil { fmt.Println(err) } fmt.Println(foo) // &{Bar:This is the new value of bar} }
Durch die Bereitstellung eines konkreten Typs, entweder durch einen Zeiger oder eine Typzusicherung, stellen Sie dies sicher json.Unmarshal entmarshmiert die Daten direkt in die gewünschte Struktur und behält dabei ihre Typinformationen und Feldwerte bei.
Das obige ist der detaillierte Inhalt vonWarum schlägt „json.Unmarshal' fehl, wenn Schnittstellen anstelle von Strukturen verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!