如上面的代码所示,可以使用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"`
}
答案 0 :(得分:26)
Struct值编码为JSON对象。除非
,否则每个导出的struct字段都将成为该对象的成员
- 字段的标记是" - "或
- 该字段为空,其标记指定" 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)
}
答案 1 :(得分:-11)
简单方法
type <name> struct {
< varname > < vartype > \`json : -\`
}
示例:
type Boy struct {
name string \`json : -\`
}
这种关于编组name
的方法不会被序列化。