type Resp struct {
    Code int `json:"code"`
    Id   json.Number `json:"id"`
}
var r Resp
err := json.Unmarshal(body, &r)

调用第三方接口后解析结构体失败,提示数字无法写入字符串字段。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,对方返回的字段类型与本地结构体定义不一致,或者同一字段有时是数字有时是字符串。

「Go JSON 反序列化」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。改完隔一天再看一次,当场正常不代表能稳住。

测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

处理上按这个顺序:按实际返回定义字段类型;不确定时用自定义类型实现解析;解析前打印原始报文核对。

改完只确认一件事:同一接口多次返回都能解析成功,字段值完整没有丢失。

作者 9823189