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

golang json封送:如何省略空嵌套结构,json,go,Json,Go,如上面的代码所示,可以使用json:“,ompitempty”忽略结构中的某些字段以显示在json中 比如说 type ColorGroup struct { ID int `json:",omitempty"` Name string Colors []string } type Total struct { A ColorGroup`json:",omitempty"` B string`json:",omitempty"` } group

如上面的代码所示,可以使用
json:“,ompitempty”
忽略结构中的某些字段以显示在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 := Total{
       B:"abc",

}
A
仍显示在
json.Marshal(组)

问题是我们怎样才能得到唯一的答案

{"B":"abc"}
编辑: 在谷歌搜索之后,这里有一个建议,换句话说,把
Total
变成

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

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

  • 字段的标记为“-”,或
  • 该字段为空,其标记指定“忽略空”选项
空值为false、0、任何nil指针或接口值,以及任何长度为零的数组、切片、映射或字符串

的声明中,隐含
组.A
将是
颜色组
结构类型的零值。请注意,结构类型的零值在被视为“空值”的事物列表中没有提到

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

:

捷径

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

这种封送
名称的方式将不会序列化。

我知道这是一篇旧文章。但我有一个问题。如果使用指针是一种解决方法,那么有什么问题吗?为什么不总是对属于结构的字段类型使用指针呢?如果这对某些人不起作用,那么struct标记中省略前的逗号empty很重要。当我忽略它时,字段总是被忽略,即使它不是-nill。以防万一有人碰到我的问题。。。不要在逗号和省略之间留空格。至少有15人在没有向我们解释的情况下否决了这一点why@JeshanBabooa, 1. <代码>名称
字段未导出!导出字段的第一个字母必须为大写。2. <代码>json:“-”在导出字段时有效。3.最后一句话:如果字段被导出
json:“-”
将完全忽略它。。。。
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)
}
type <name> struct {
< varname > < vartype > \`json : -\`
}
type Boy struct {
name string \`json : -\`
}