Go处理JSON错误需检查marshal/unmarshal返回值:marshal失败因不支持类型或循环引用;unmarshal需区分语法错误与类型不匹配;建议预检json.Valid、实现自定义方法增强控制;生产环境应分级响应错误。
Go语言中处理JSON序列化错误,关键在于理解json.Marshal和json.Unmarshal的返回值机制,并对常见错误类型做针对性判断与恢复。
json.Marshal失败通常源于数据结构不支持序列化,比如包含函数、channel、map或struct中字段不可导出(首字母小写)且未设置JSON标签。它不会panic,而是返回error值,必须显式检查。
"json: unsupported type"类错误"json: invalid recursive type"
需用time.Time并确保已实现MarshalJSON(),否则可能因底层格式问题失败json.Unmarshal报错更常见,需区分两类主要错误:
"invalid character"或"expected object"
"123"字符串尝试解到int字段,或JSON对象字段名与struct字段名/标签不匹配导致零值填充但无报错;真正报错多发生在类型强约束场景(如解到*int但JSON为null且指针未初始化)建议先用json.Valid([]byte)预检原始字节是否为合法JSON,再执行Unmarshal,避免混淆语法与语义错误。
立即学习“go语言免费学习笔记(深入)”;
当标准行为不满足需求(如忽略零值、格式化时间、处理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,以防无限递归不要只打印错误或忽略,应结合上下文做分级响应:
400 Bad Request及简洁提示(如{"error": "invalid JSON format"}),不暴露内部结构sync.Once加载失败后启用内存默认配置)