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
相关产品推荐
相关产品推荐

