You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 19:35:22