2015-10-31 14 views
9

go playgroundgolang json Marszałek: jak pominąć pusty zagnieżdżonych struktury

Jak pokazano w powyższym kodzie, można użyć json:",omitempty" pominięcie niektórych pól w struct do stawienia się w json.

Na przykład

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{}, 

} 

W tym przypadku B nie pojawi się w json.Marshal(group)

Jednak jeśli

group := Total{ 
     B:"abc", 

} 

A nadal pojawia się w json.Marshal(group)

{"A":{"Name":"","Colors":null},"B":"abc"} 

Pytanie brzmi, jak możemy dostać tylko

{"B":"abc"} 

EDIT: Po pewnym googling, oto propozycja use pointer, innymi słowy, skręcić Total do

type Total struct { 
    A *ColorGroup`json:",omitempty"` 
    B string`json:",omitempty"` 
} 

Odpowiedz

12

Od the documentation:

Wartości strukturalne kodują jako obiekty JSON. Każde pole struct eksportowane staje się członkiem obiektu chyba

  • tag dziedzinie jest „-” lub
  • pole jest puste i jego tag określa opcję „omitempty”.

Pustymi wartościami są: false, 0, dowolny wskaźnik zerowy lub wartość interfejsu oraz dowolna tablica, wycinek, mapa lub ciąg o długości zero.

W swojej deklaracji group, to niejawna że group.A będzie wartość zerowa typu ColorGroup struct. Zauważ, że typy zerowej-struktury-typu nie są wymienione na tej liście rzeczy, które są uważane za "puste wartości".

Jak ustalono, obejściem tego problemu jest użycie wskaźnika. To zadziała, jeśli nie podasz A w swojej deklaracji group. Jeśli określisz go jako wskaźnik do zerowej struktury, to pojawi się ponownie.

playground link:

package main 

import (
    "encoding/json" 
    "fmt" 
    "os" 
) 

func main() { 
    type colorGroup struct { 
     ID  int `json:",omitempty"` 
     Name string 
     Colors []string 
    } 
    type total struct { 
     A *colorGroup `json:",omitempty"` 
     B string  `json:",omitempty"` 
    } 

    groupWithNilA := total{ 
     B: "abc", 
    } 
    b, err := json.Marshal(groupWithNilA) 
    if err != nil { 
     fmt.Println("error:", err) 
    } 
    os.Stderr.Write(b) 

    println() 

    groupWithPointerToZeroA := total{ 
     A: &colorGroup{}, 
     B: "abc", 
    } 
    b, err = json.Marshal(groupWithPointerToZeroA) 
    if err != nil { 
     fmt.Println("error:", err) 
    } 
    os.Stderr.Write(b) 
} 
-7

Łatwy sposób

type <name> struct { 
<varname> <vartype> \`json : -\` 
} 

Przykład:

type Boy struct { 
name string \`json : -\` 
} 

ten sposób na Organizowanie name nie dostanie odcinkach.

Powiązane problemy