Heim >Backend-Entwicklung >Golang >Wie kann man leere verschachtelte Strukturen in Gos „json.Marshal' weglassen?

Wie kann man leere verschachtelte Strukturen in Gos „json.Marshal' weglassen?

DDD
DDDOriginal
2024-12-09 07:49:05996Durchsuche

How to Omit Empty Nested Structs in Go's `json.Marshal`?

Golang JSON Marshal: So lassen Sie leere verschachtelte Strukturen weg

In komplexen JSON-Codierungsszenarien kann es vorkommen, dass auch verschachtelte leere Strukturen codiert werden, obwohl sie weggelassen werden sollten aus Platz- und Effizienzgründen. Betrachten Sie beispielsweise den folgenden Codeausschnitt:

type ColorGroup struct {
    ID     int `json:",omitempty"`
    Name   string
    Colors []string
}
type Total struct {
    A ColorGroup `json:",omitempty"`
    B string     `json:",omitempty"`
}

Wenn json.Marshal für eine Instanz von Total mit einem leeren A-Feld verwendet wird, erscheint es weiterhin im Ausgabe-JSON:

group := Total{
    A: ColorGroup{},  // An empty ColorGroup instance
}

json.Marshal(group) // Output: {"A":{"Name":"","Colors":null},"B":null}

Das gewünschte Ergebnis besteht darin, das A-Feld vollständig wegzulassen:

{"B":null}

Lösung: Verwendung von Pointer Typen

Der Schlüssel zur Lösung dieses Problems liegt in der Verwendung von Zeigern. Wenn das A-Feld in Total als Zeiger deklariert ist, wird es automatisch auf Null gesetzt, wenn es nicht explizit zugewiesen wird, wodurch das Problem der leeren Strukturcodierung gelöst wird:

type ColorGroup struct {
    ID     int `json:",omitempty"`
    Name   string
    Colors []string
}
type Total struct {
    A *ColorGroup `json:",omitempty"`  // Using a pointer to ColorGroup
    B string     `json:",omitempty"`
}

Mit dieser Änderung wird die json.Marshal-Ausgabe wird nun das leere A-Feld korrekt weglassen:

group := Total{
    B: "abc",  // Assigning a value to the B field
}

json.Marshal(group) // Output: {"B":"abc"}

Das obige ist der detaillierte Inhalt vonWie kann man leere verschachtelte Strukturen in Gos „json.Marshal' weglassen?. 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