golang json marshal:如何省略空嵌套结构

时间:2015-10-31 02:03:46

标签: json go

go playground

如上面的代码所示,可以使用json:",omitempty"来省略结构中的某些字段以显示在json中。

例如

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

}

在这种情况下,B无法显示在json.Marshal(group)

但是,如果

group := Total{
       B:"abc",

}

A仍显示在json.Marshal(group)

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

问题是我们如何才得到

{"B":"abc"}

编辑: 经过一些谷歌搜索后,这是一个建议use pointer,换句话说,转为Total进入

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

2 个答案:

答案 0 :(得分:26)

来自the documentation

  

Struct值编码为JSON对象。除非

,否则每个导出的struct字段都将成为该对象的成员      
      
  • 字段的标记是" - "或
  •   
  • 该字段为空,其标记指定" omitempty"选项。
  •   
     

空值为false,0,任何nil指针或接口值,以及长度为零的任何数组,切片,映射或字符串。

在您的group声明中,隐含group.A将是ColorGroup结构类型的零值。并注意到,在被视为"空值"的事物列表中没有提到零值结构类型。

正如您所发现的,您的案例的解决方法是使用指针。如果您未在A声明中指定group,这将有效。如果您将其指定为零结构的指针,则它将再次显示。

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)
}

答案 1 :(得分:-11)

简单方法

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

示例:

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

这种关于编组name的方法不会被序列化。