Go处理JSON错误需检查marshal/unmarshal返回值:marshal失败因不支持类型或循环引用;unmarshal需区分语法错误与类型不匹配;建议预检json.Valid、实现自定义方法增强控制;生产环境应分级响应错误。

Go语言中处理JSON序列化错误,关键在于理解json.Marshal和json.Unmarshal的返回值机制,并对常见错误类型做针对性判断与恢复。
检查Marshal返回的错误并分类处理
json.Marshal失败通常源于数据结构不支持序列化,比如包含函数、channel、map或struct中字段不可导出(首字母小写)且未设置JSON标签。它不会panic,而是返回error值,必须显式检查。
- 若传入nil指针或未初始化的interface{},会返回
"json: unsupported type"类错误 - 循环引用(如struct A含指向A的指针)会触发
"json: invalid recursive type" - 时间类型需用
time.Time并确保已实现MarshalJSON(),否则可能因底层格式问题失败
Unmarshal时区分语法错误与类型不匹配
json.Unmarshal报错更常见,需区分两类主要错误:
-
JSON语法错误:如字符串缺少引号、逗号遗漏、括号不闭合,错误信息含
"invalid character"或"expected object" -
目标类型不兼容:例如把
"123"字符串尝试解到int字段,或JSON对象字段名与struct字段名/标签不匹配导致零值填充但无报错;真正报错多发生在类型强约束场景(如解到*int但JSON为null且指针未初始化)
建议先用json.Valid([]byte)预检原始字节是否为合法JSON,再执行Unmarshal,避免混淆语法与语义错误。
立即学习“go语言免费学习笔记(深入)”;
利用自定义MarshalJSON/UnmarshalJSON增强控制力
当标准行为不满足需求(如忽略零值、格式化时间、处理NaN浮点数),可为类型实现json.MarshalJSON() ([]byte, error)和json.UnmarshalJSON([]byte) error方法。
- 在
MarshalJSON中可提前校验字段有效性,返回有意义的错误(如fmt.Errorf("invalid status: %s", s.Status)) - 在
UnmarshalJSON中可用json.RawMessage延迟解析,或对异常值(如"N/A")做容错映射 - 注意避免在自定义方法中调用本类型的
json.Marshal/Unmarshal,以防无限递归
生产环境推荐的错误处理模式
不要只打印错误或忽略,应结合上下文做分级响应:










