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

Go语言使用struct序列化JSON时如何将null空数组处理为空数组[]

问题原因

Go 标准库 encoding/json 对切片类型的序列化规则如下:

  • 未分配内存的 nil 切片会被序列化为 null
  • 已分配内存但长度为0的空切片会被序列化为 []

你当前代码中实例化 Policies 结构体时,内部的 Policies 切片没有显式初始化,默认值为 nil,所以无数据时序列化后就返回了 null。

解决方案

方案1:显式初始化切片(最常用,成本最低)

实例化 Policies 结构体时,直接将内部切片初始化为长度为0的空切片即可,无需修改结构体定义:

// 初始化时显式给Policies字段分配空切片,避免出现nil
cancelPolicyMain := Policies{Policies: make([]RoomPolicies, 0)}
cancelPolicy := RoomPolicies{}

if cancelAmount < 0 {
  cancelPolicy.Amount = cancelAmount
  cancelPolicy.DaysBeforeCheckIn = cancelDay
  cancelPolicyMain.Policies = append(cancelPolicyMain.Policies, cancelPolicy)
}
// else分支无需额外处理,已经初始化的空切片无元素时序列化就是[]

如果你的逻辑需要在else分支重置结构体,也按同样的方式赋值:

else {
  cancelPolicyMain = Policies{Policies: make([]RoomPolicies, 0)}
}

方案2:自定义序列化方法(适合不能修改初始化逻辑的场景)

如果项目中多处用到该结构体,不想逐个修改初始化逻辑,可以给 Policies 结构体实现自定义的 MarshalJSON 方法,自动处理nil切片的情况:

import "encoding/json"

func (p Policies) MarshalJSON() ([]byte, error) {
    // 切片为nil时手动返回空数组结构
    if p.Policies == nil {
        return []byte(`{"policies":[]}`), nil
    }
    // 用别名避免无限递归调用MarshalJSON
    type PoliciesAlias Policies
    return json.Marshal(PoliciesAlias(p))
}
注意事项

不要给 policies 字段的JSON标签加 omitempty 属性,否则为nil时会直接丢弃该字段,无法保留空数组的输出结构。

内容的提问来源于stack exchange,提问作者sunil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:24:04