Unmarshalling von JSON kann eine Herausforderung sein, wenn ein Feld inkonsistent sein kann und so aussieht entweder eine Zeichenfolge oder ein Array von Zeichenfolgen. Diese Inkonsistenz kann zu Unmarshalling-Fehlern führen, die dazu führen, dass Ihre Anwendung fehlschlägt.
Rohdatenerfassung von JSON verwenden
Verwenden Sie die json.RawMessage-Daten Struktur, um das variierende JSON-Feld als Rohdaten zu erfassen. Nutzen Sie außerdem das JSON-Namensschild „-“, um das Feld während der ersten Dekodierungsphase zu verbergen.
type MyListItem struct { Date string `json:"date"` RawDisplayName json.RawMessage `json:"display_name"` DisplayName []string `json:"-"` }
Unmarshal Top-Level JSON
Unmarshall the top- JSON-Struktur auf Ebene ohne Ausfüllen des DisplayName-Felds.
var li MyListItem if err := json.Unmarshal(data, &li); err != nil { // handle error }
Rohanzeige analysieren Name
Entpacken Sie je nach Art der Rohdaten den Anzeigenamen in das entsprechende Format.
if len(li.RawDisplayName) > 0 { switch li.RawDisplayName[0] { case '"': if err := json.Unmarshal(li.RawDisplayName, &li.DisplayName); err != nil { // handle error } case '[': var s []string if err := json.Unmarshal(li.RawDisplayName, &s); err != nil { // handle error } // Join arrays with "&&" li.DisplayName = strings.Join(s, "&&") } }
Handle Listings Array
Integrieren Sie die oben genannte Logik in eine Schleife, um ein Array von MyListItem-Objekten innerhalb eines MyListings zu verarbeiten Struktur.
var listings MyListings if err := json.Unmarshal([]byte(data), &listings); err != nil { // handle error } for i := range listings.CLItems { li := &listings.CLItems[i] // Parse raw display name if len(li.RawDisplayName) > 0 { switch li.RawDisplayName[0] { case '"': if err := json.Unmarshal(li.RawDisplayName, &li.DisplayName); err != nil { // handle error } case '[': var s []string if err := json.Unmarshal(li.RawDisplayName, &s); err != nil { // handle error } li.DisplayName = strings.Join(s, "&&") } } }
Logik kapseln
Für wiederholtes Vorkommen von Feldern mit unterschiedlichen Typen sollten Sie erwägen, die Parsing-Logik in einen benutzerdefinierten Typ zu kapseln, der die json.Unmarshaler-Schnittstelle implementiert .
Handle-Array Werte
Um den Feldwert als Teil von Zeichenfolgen und nicht als verbundene Zeichenfolge beizubehalten, ändern Sie den Typ multiString entsprechend.
Diese Techniken bieten robuste Methoden für den Umgang mit inkonsistenten JSON-Feldern und stellen so sicher erfolgreiches Unmarshalling und genauer Datenabruf.
Das obige ist der detaillierte Inhalt vonWie kann ich inkonsistente String- oder Array-JSON-Felder effizient entmarshalieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!