Go语言JSON解析需精准错误处理:区分json.SyntaxError、json.UnmarshalTypeError等类型定位问题,用UnmarshalJSON方法增强容错,结合struct tag控制行为,统一处理并脱敏日志。
Go 语言中使用 encoding/json 解析 JSON 时,错误处理不能只靠 if err != nil 粗粒度判断,而应结合错误类型、字段上下文和结构体设计,精准定位和响应问题。
json.Unmarshal 返回的错误通常是 *json.SyntaxError、*json.UnmarshalTypeError 或 *json.InvalidUnmarshalError。直接打印错误可能只显示模糊信息(如“invalid character 'x' after object key”),但类型断言可提取关键细节:
*json.SyntaxError:指出错位置(Offset),可用于定位原始 JSON 中的非法字符*json.UnmarshalTypeError:包含出错字段名(Field)、期望类型(Type)和实际值(Value),对调试字段类型不匹配极有用io.EOF 或 io.ErrUnexpectedEOF:常出现在 JSON 截断或空输入时,需单独检查对易出错字段(如数字/字符串混用、可选字段缺失),可在结构体中实现 UnmarshalJSON 方法,把解析逻辑收口并提供降级策略:
"123")自动转为 int,避免 UnmarshalTypeError
"parsing user.age")合理使用 struct tag 可减少错误发生概率:
json:",omitempty":跳过零值字段,避免反序列化时因空值触发校验失败json:"name,string":告诉解码器把 JSON 字符串当作目标字段类型(如把 "123" 当作 int 解析)json:"-":忽略该字段,防止未知字段导致解析中断(配合 Decoder.DisallowUnknownFields() 可精细控制)在服务端 API 中,不建议把原始 JSON 错误直接返回
给前端。推荐做法:
400 Bad Request + 清晰提示(如 “age must be a number”)json.Unmarshal 调用,避免每个 handler 重复写错误分支