2015-10-31 4 views
9

go playgroundgolang JSONマーシャル:上記のコードに示すように、空のネストされた構造体を

を省略する方法、一方はJSONに表示する構造体に特定のフィールドを省略するjson:",omitempty"を使用することができます。この場合

例えば

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

} 

group := Total{ 
     B:"abc", 

} 

Aまだjson.Marshal(group)

{"A":{"Name":"","Colors":null},"B":"abc"} 
に現れた場合、 Bは、しかしながら json.Marshal(group)

に表示されません

質問は我々だけ

{"B":"abc"} 

EDIT入手行う方法です:いくつかのグーグル後 を、ここで提案use pointerthe documentationからTotal

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

答えて

12

を回し、言い換えれば、次のとおりです。

構造体の値はJSONオブジェクトとしてエンコードされます。 「 - 」、または

  • フィールドが空で、そのタグが「omitempty」オプションを指定する

    • フィールドのタグがある場合を除き、各エクスポート構造体のフィールドは、オブジェクトのメンバーになります。

    空の値は、0、任意のnilポインタまたはインターフェイス値、および長さ0の配列、スライス、マップ、または文字列です。 groupのあなたの宣言で

  • 、それはgroup.AColorGroup構造体型のゼロ値になることを暗黙のです。また、空の値とみなされるもののリストには、ゼロ値の構造体型は記述されていないことに注意してください。

    見つかったとおり、ケースの回避策はポインタを使用することです。これは、groupの宣言にAを指定しないと機能します。ゼロ構造体へのポインタであると指定すると、それは再び表示されます。

    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

    簡単な方法

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

    例:

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

    このようnameをマーシャリングには、シリアル化された取得することはできません。

    関連する問題