Unmarshalling von JSON mit dynamischer Array-Struktur
Beim Abrufen von JSON-Daten aus Quellen Dritter kann die Datenstruktur variieren und manchmal Arrays und enthalten manchmal nicht. Dies kann bei der Verwendung der json.Unmarshal-Funktion von Go zu Herausforderungen führen, da sie erwartet, dass eine bestimmte Struktur mit der JSON-Struktur übereinstimmt.
Ein gängiger Ansatz zur Handhabung dieses Problems besteht darin, eine sekundäre Struktur mit einem Slice zu erstellen, wie zum Beispiel:
type ResponseWithSlice struct { Gwrcmds struct { Gwrcmd []struct { // Nested struct now a slice Gcmd string Gdata struct { Gip struct { Version string } } } } }
Das funktioniert, aber es erfordert das Duplizieren der Struktur, was umständlich sein kann.
Eine vielseitigere Lösung beinhaltet mit json.RawMessage:
type Response struct { RawGwrcmd json.RawMessage `json:"gwrcmds"` }
Bei diesem Ansatz wird das gwrcmds-Feld als rohe JSON-Nachricht gespeichert, sodass wir einen Blick darauf werfen und es entsprechend entmarshamnieren können:
func (r *Response) UnmarshalJSON(b []byte) error { if err := json.Unmarshal(b, &r.RawGwrcmd); err != nil { return err } if r.RawGwrcmd[0] == '[' { // Check if it's an array return json.Unmarshal(r.RawGwrcmd, &r.Gwrcmds.Gwrcmd) } return json.Unmarshal(r.RawGwrcmd, &r.Gwrcmds.Gwrcmd) // Otherwise, treat it as a single struct }
Dies Mit der Methode können wir sowohl Array- als auch Nicht-Array-Strukturen verarbeiten, ohne dass zusätzliche Strukturen erforderlich sind.
Das obige ist der detaillierte Inhalt vonWie kann ich JSON mit dynamischen Array-Strukturen in Go effizient entmarshalieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!