如何在Go语言中将结构体指针字段序列化为含null的JSON?
Go结构体序列化出{"Foo": null}的解决办法
问题根源
Go标准库的json.Marshal默认会跳过零值字段,*string类型的零值就是nil。所以哪怕你把res1.Foo设成了nil,要是结构体字段没加合适的JSON标签,序列化的时候这个字段直接就被省略了,出不来"Foo": null。
正确操作步骤
核心就是给结构体的Foo字段加json:"Foo"标签(别加omitempty),这样就算字段是零值(nil),也会被转成JSON的null。
1. 修改结构体定义
type Result struct { Foo *string `json:"Foo"` }
2. 构造实例并序列化
你之前的方法2已经把Foo设成nil了(其实这步都能省,因为指针类型默认就是nil),现在直接序列化就行:
package main import ( "encoding/json" "fmt" ) type Result struct { Foo *string `json:"Foo"` } func main() { var res1 Result // res1.Foo = nil // 这行可以省略,指针默认值就是nil data, err := json.Marshal(res1) if err != nil { fmt.Println("序列化出错:", err) return } fmt.Println(string(data)) // 输出就是 {"Foo": null} }
为啥之前的方法没效果?
- 方法1:
json.Unmarshal(nil, &res1)完全没必要,nil作为输入的话只会把res1设成零值,但核心问题还是结构体没加正确的JSON标签,序列化时字段被跳过。 - 方法2:虽然
res1.Foo是nil,但结构体字段没加json:"Foo"标签(或者带了omitempty),json.Marshal默认跳过零值字段,所以出不来"Foo": null。
额外提醒
如果之前结构体字段加了json:"Foo,omitempty",那哪怕Foo是nil也会被省略。要输出null,必须去掉omitempty,只保留json:"Foo"。
内容的提问来源于stack exchange,提问作者icn
相关产品推荐
相关产品推荐

