Unmarshalling von JSON mit variabler Array-Rückgabe
Beim Abrufen von JSON aus externen Quellen kann die Struktur der Antwort variieren, was das Unmarshalling schwierig macht in eine feste Go-Struktur. Dies wird besonders deutlich, wenn der JSON ein Array oder ein einzelnes Objekt für dieselbe Eigenschaft enthalten kann.
Im bereitgestellten Beispiel enthält die JSON-Antwort eine Eigenschaft namens „gwrcmd“, die entweder ein Array von Objekten oder sein kann ein singuläres Objekt. Um dieses Problem zu beheben, besteht ein Ansatz darin, eine zweite Struktur mit denselben Feldern wie das Original, aber mit einem Slice für die Eigenschaft „gwrcmd“ zu erstellen. Eine flexiblere Lösung kann jedoch mit json.RawMessage erreicht werden.
json.RawMessage ermöglicht das Unmarshalling unbekannter Typen in einen rohen JSON-String. Diese Funktion kann verwendet werden, um einen Blick in den JSON-Code zu werfen und die geeignete Methode zum Unmarshalieren in den entsprechenden Go-Typ zu bestimmen.
Betrachten Sie das folgende vereinfachte Beispiel:
type Response struct { RawAWrapper struct { RawA json.RawMessage `json:"a"` } A A `json:"-"` As []A `json:"-"` } type A struct { B string } func (r *Response) UnmarshalJSON(b []byte) error { if err := json.Unmarshal(b, &r.RawAWrapper); err != nil { return err } if r.RawAWrapper.RawA[0] == '[' { return json.Unmarshal(r.RawAWrapper.RawA, &r.As) } return json.Unmarshal(r.RawAWrapper.RawA, &r.A) }
In diesem Beispiel ist die json.RawMessage-Feld RawA erfasst den JSON-Wert der Eigenschaft „a“. Anhand des ersten Bytes des Roh-JSON können wir bestimmen, ob der Wert ein Array ([]) oder ein Objekt („{“) ist. Diese Informationen werden dann verwendet, um den Wert entweder in die A-Struktur (für Objekte) oder das As-Slice (für Arrays) zu entmarshalieren.
Dieser Ansatz bietet eine flexiblere und robustere Möglichkeit, JSON-Antworten mit variablen Strukturen zu verarbeiten. Es macht doppelte Strukturen überflüssig und ermöglicht ein dynamisches Unmarshalling basierend auf dem JSON-Inhalt.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit Variablen-Array-Rückgaben um, wenn ich JSON in Go entmarshalle?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!