Unmarshalling inkonsistenter JSON-Felder mit Arrays und Strings
Unmarshalling von JSON kann eine Herausforderung sein, wenn die Daten inkonsistent sind, beispielsweise wenn ein Feld inkonsistent sein kann entweder eine Zeichenfolge oder ein Array von Zeichenfolgen. Um dieses Szenario zu bewältigen, können wir verschiedene Strategien anwenden.
Variierende Daten mit RawMessage erfassen
Für Felder mit unterschiedlichen Typen können wir json.RawMessage verwenden, um die nicht analysierten Daten zu erfassen Daten. Dadurch können wir das Feld nach dem Unmarshalling des JSON der obersten Ebene manipulieren.
Felder mit „-“-Tag ausblenden
Um das Feld „DisplayName“ vor der automatischen Dekodierung auszublenden , können wir das Tag „-“ in der Strukturdefinition verwenden. Dadurch wird verhindert, dass die Anwendung diesem Feld während des Unmarshallings auf oberster Ebene Werte zuweist.
Bestimmen des Feldtyps und Ausfüllen
Sobald der JSON der obersten Ebene dekodiert wurde, können wir kann den Typ des RawDisplayName-Felds überprüfen, um festzustellen, ob es sich um eine Zeichenfolge oder ein Array handelt. Wenn es sich um einen String handelt, entpacken wir ihn in ein String-Slice. Wenn es sich um ein Array handelt, verbinden wir die Werte mit „&&“ gemäß der ursprünglichen Frage.
Benutzerdefinierte Unmarshal-Schnittstelle
Für Szenarien mit mehreren Feldern unterschiedlichen Typs gilt: Es kann von Vorteil sein, die Parsing-Logik in einem benutzerdefinierten Typ zu kapseln, der die json.Unmarshaler-Schnittstelle implementiert. Dies ermöglicht eine zentrale Kontrolle über den Datenkonvertierungsprozess.
Beispielimplementierung
Hier ist eine Beispielimplementierung, die den angegebenen JSON verarbeitet:
package main import ( "encoding/json" "fmt" "strings" ) type multiString string func (ms *multiString) UnmarshalJSON(data []byte) error { *ms = "" if len(data) > 0 { switch data[0] { case '"': var s string if err := json.Unmarshal(data, &s); err != nil { return err } *ms = multiString(s) case '[': var s []string if err := json.Unmarshal(data, &s); err != nil { return err } *ms = multiString(strings.Join(s, "&&")) } } return nil } type MyListItem struct { Date string `json:"date"` DisplayName multiString `json:"display_name"` } type MyListings struct { CLItems []MyListItem `json:"myitems"` } func main() { var listings MyListings err := json.Unmarshal([]byte(`{ "date": "30 Apr", "display_name": "Mr Smith" },{ "date": "30 Apr", "display_name": ["Mr Smith", "Mr Jones"] }`), &listings) if err != nil { fmt.Println(err) return } fmt.Println(listings) }
Durch die Verwendung dieser Techniken können wir JSON effektiv mit Feldern unterschiedlicher Art entmarshamlingieren und so sicherstellen, dass die Anwendung die Daten korrekt verarbeiten kann.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit inkonsistenten JSON-Feldern um: Strings vs. String-Arrays?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!