如何在Go嵌套结构体中设置可选JSON字段 无值时不被序列化输出
问题根因
该问题基本由两类常见编码错误导致:
- 结构体JSON标签格式错误:Go语言要求结构体标签中
json:和后续双引号之间不能存在空格,如果你写的是json: "data2,omitempty"(冒号后带空格),encoding/json库无法正确识别omitempty配置,就会导致空字符串字段依然被输出。 - 使用了非标准的JSON序列化库:部分第三方JSON序列化包对
omitempty的处理逻辑和标准库不一致,未做对应配置的情况下会忽略omitempty规则。
标准库正确实现示例
使用标准库encoding/json,只要标签格式正确,运行结果和你的预期完全一致,代码如下:
package main import ( "encoding/json" "fmt" ) type Test struct { Data NestTest `json:"data"` } type NestTest struct { NestData1 string `json:"data1"` NestData2 string `json:"data2,omitempty"` // 注意冒号和引号之间无空格 } func main() { test := Test{ Data: NestTest{ NestData1: "something", }, } b, err := json.Marshal(test) if err != nil { panic(err) } fmt.Printf("the test struct json string is: %s", string(b)) // 输出结果:the test struct json string is: {"data":{"data1":"something"}} }
延伸场景说明
如果你希望整个嵌套的data字段在无值的时候也不输出,可以把嵌套结构体字段改为指针类型并加上omitempty标签:
type Test struct { Data *NestTest `json:"data,omitempty"` // 改为指针类型 + omitempty配置 } // 当Data为nil时,序列化结果为 {} test := Test{ Data: nil, }
小提示:如果业务需要区分「字段未赋值」和「字段赋值为类型零值」(比如空字符串、0、false),可以把字段定义为指针类型,此时
omitempty仅在指针为nil时忽略字段,哪怕指针指向的是零值也会正常序列化。
内容的提问来源于stack exchange,提问作者ccd
相关产品推荐
相关产品推荐

