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

新手上路,请多包涵

去游乐场

如上面的代码所示,可以使用 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"}

编辑:谷歌搜索后,这里建议 使用 pointer ,换句话说,将 Total 变成

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

原文由 Zhe Hu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 810
1 个回答

文档中

结构值编码为 JSON 对象。每个导出的结构字段都成为对象的成员,除非

  • 该字段的标签是“-”,或者
  • 该字段为空,其标签指定了“omitempty”选项。

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

group 的声明中,隐含的是 group.A 将是 ColorGroup 结构类型的零值。请注意,在被视为“空值”的事物列表中未提及结构类型的零值。

如您所见,您的案例的解决方法是使用指针。如果您在 A group 这将起作用。如果您将它指定为指向零结构的指针,那么它将再次出现。

游乐场链接

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

原文由 Amit Kumar Gupta 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题