Heim >Backend-Entwicklung >Golang >Wie gehe ich beim Marshaling an JSON in Go richtig mit verschachtelten leeren Strukturen um?

Wie gehe ich beim Marshaling an JSON in Go richtig mit verschachtelten leeren Strukturen um?

Susan Sarandon
Susan SarandonOriginal
2024-12-18 06:41:10563Durchsuche

How Do I Properly Handle Nested Empty Structs When Marshaling to JSON in Go?

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:

  • Null sind Zeiger
  • Nullwerte (z. B. false, 0)

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:

  • Wenn ein Zeiger auf eine Struktur ungleich Null übergeben wird, wird er sogar in die JSON-Ausgabe einbezogen wenn es leer ist.
  • Diese Lösung kann nur auf verschachtelte Strukturen angewendet werden. Für nicht verschachtelte leere Strukturen reicht die Verwendung des Tags „,omitempty“ ohne Zeiger aus.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn