Umgang mit verschachtelten leeren Strukturen beim JSON-Marshalling in Go
Einführung
Bei Verwendung der Kodierung /json-Paket in Go zum Marshallen von Strukturen in JSON, das Tag „,omitempty“ kann zum Ausschließen verwendet werden leere Felder aus dem resultierenden JSON. Allerdings verhält sich dieses Tag bei verschachtelten Strukturen möglicherweise nicht wie erwartet.
Frage
Betrachten Sie das folgende Beispiel:
type ColorGroup struct { ID int `json:",omitempty"` Name string Colors []string } type Total struct { A ColorGroup `json:",omitempty"` B string `json:",omitempty"` } group := Total{ A: ColorGroup{}, } json.Marshal(group)
In diesem Szenario Die JSON-Ausgabe sollte nur das B-Feld enthalten, da das A-Feld leer ist. Die Ausgabe enthält jedoch weiterhin das A-Feld mit leeren Werten ({"A": {"Name": "", "Farben": null}, "B": null}).
Antwort
In der Dokumentation zum JSON-Marshalling in Go heißt es, dass Strukturfelder als leer gelten, wenn sie:
Im bereitgestellten Beispiel ist group.A eine leere Struktur, kein Nullzeiger oder ein Sammlungstyp (z. B. Slice). , Karte). Daher wird er vom Marshaller nicht als leerer Wert behandelt.
Um das gewünschte Verhalten zu erreichen, kann man einen Zeiger auf die verschachtelte Struktur verwenden:
type ColorGroup struct { ID int `json:",omitempty"` Name string Colors []string } type Total struct { A *ColorGroup `json:",omitempty"` B string `json:",omitempty"` } group := Total{ B: "abc", } json.Marshal(group)
Mit dieser Modifikation wird der JSON Die Ausgabe enthält nur das B-Feld: {"B": "abc"}.
Hinweis:
Das obige ist der detaillierte Inhalt vonWie gehe ich beim Marshaling an JSON in Go richtig mit verschachtelten leeren Strukturen um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!