go 的 encoding/json 默认不支持 nil 指针字段反序列化且无容错机制:导出字段需正确 json tag,小写字段被忽略;下划线 key 需显式 tag;nil 指针不自动初始化;数字默认 float64 易致 int64 解析失败;嵌套 null 值需用指针避免 panic;无宽松模式,须审慎定义 struct。
Go 的 encoding/json 标准库解析 JSON 时,**默认不支持 nil 指针字段的反序列化,也不自动处理类型不匹配或缺失字段的容错**——这意味着你写的 struct 字段名、tag、类型稍有偏差,json.Unmarshal 就会静默跳过或报错,而不是“尽力而为”。
struct 字段必须导出且带正确 json tag
Go 只能对首字母大写的导出字段进行 JSON 反序列化。如果字段小写(比如 name string),即使写了 `json:"name"`,json.Unmarshal 也完全忽略它。
常见错误场景:从 API 接收 JSON 后,struct 字段没加 json:"xxx" tag,或拼写不一致(如后端返回 "user_id",你写成 UserID int `json:"userId"`)。
- 字段名大小写必须匹配 JSON key,或靠
json:tag 显式映射 - 嵌套结构体字段也要导出,否则内层字段无法解析
- 如果 JSON key 是下划线风格(如
"created_at"),tag 必须写成`json:"created_at"`,不能依赖 Go 字段名自动转驼峰
nil 指针字段不会被自动初始化
如果你定义了 CreatedAt *time.Time 这样的指针字段,但 JSON 中该字段为 null 或缺失,json.Unmarshal 不会把指针设为 nil,也不会分配新值——它直接跳过,保持原值(可能是未初始化的 nil,也可能是个旧时间)。这容易导致空指针 panic 或逻辑错乱。
解决办法不是靠“默认行为”,而是显式控制: