Beim Umgang mit JSON-Antworten kann es erforderlich sein, bestimmte verschachtelte Objekte stattdessen als Rohstrings oder Byte-Arrays beizubehalten sie in Go-Strukturen analysieren zu lassen. Um dieses Problem zu beheben, werden wir eine Lösung unter Verwendung des Typs json.RawMessage aus dem Paket „encoding/json“ untersuchen.
In Ihrem spezifischen Szenario sollte das folgende JSON:
{ "id" : 15, "foo" : { "foo": 123, "bar": "baz" } }
nicht gemarshallt werden in eine Go-Struktur mit einem ID-Feld vom Typ int64 und einem Foo-Feld vom Typ []byte. Der aufgetretene Fehler „json: Objekt kann nicht in Go-Wert vom Typ []uint8 entmarshaliert werden“ weist darauf hin, dass der Unmarshalling-Prozess versucht hat, das foo-Objekt in einen Go-Wert zu analysieren, was kein beabsichtigtes Verhalten ist.
Der Typ json.RawMessage bietet eine Lösung für dieses Problem. Wie es in der Dokumentation heißt, handelt es sich um „ein roh codiertes JSON-Objekt“, das verwendet werden kann, um die JSON-Decodierung zu verzögern oder eine JSON-Codierung vorab zu berechnen. Mit json.RawMessage können Sie das foo-Objekt effektiv als Rohbyte-Array in Ihrer Go-Struktur beibehalten:
import ( "encoding/json" "fmt" ) type Bar struct { ID int64 `json:"id"` Foo json.RawMessage `json:"foo"` } func main() { var jsonStr = []byte(`{ "id" : 15, "foo" : { "foo": 123, "bar": "baz" } }`) var bar Bar err := json.Unmarshal(jsonStr, &bar) if err != nil { panic(err) } fmt.Printf("%+v\n", bar) }
Ausgabe:
{Id:15 Foo:[123 32 34 102 111 111 34 58 32 49 50 51 44 32 34 98 97 114 34 58 32 34 98 97 122 34 32 125]}
Durch die Nutzung von json.RawMessage können Sie dies tun Entmarshalieren Sie den JSON nun erfolgreich in eine Go-Struktur, die das foo-Objekt als Byte-Array behandelt.
Das obige ist der detaillierte Inhalt vonWie entmarshaliere ich verschachtelte JSON-Objekte als Byte-Arrays in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!