json.unmarshal解析失败不报错的主因是未传指针或struct tag不匹配:必须传&u而非u;小写下划线json需用json:"user_id"显式映射;传string会panic,须转[]byte;时间字段应自定义unmarshaljson支持多格式。

json.Unmarshal 解析失败但没报错?检查指针传参
Go 的 json.Unmarshal 要求目标变量必须是指针,否则静默失败、字段全为零值。这不是 bug,是设计使然——它需要修改原始内存地址上的数据。
- 错误写法:
var u User; json.Unmarshal(data, u)→u不变,无 panic,但所有字段都是零值 - 正确写法:
var u User; json.Unmarshal(data, &u)→ 必须传&u - 切片同理:
var users []User; json.Unmarshal(data, &users),不能漏掉&
嵌套结构体字段解析不到?确认 JSON key 和 struct tag 匹配
Go 默认按字段名(首字母大写)匹配 JSON key,但大小写敏感且不自动转驼峰。多数 API 返回的是小写下划线风格(如 user_id),必须用 json tag 显式映射。
- 不加 tag 时:
UserID int会去找"UserID",但实际 JSON 是"user_id"→ 字段为空 - 加 tag 后:
UserID int `json:"user_id"`→ 正确绑定 - 忽略字段用
-:Secret string `json:"-"`;空字符串也参与解码用string,omitempty
遇到 invalid character 'x' looking for beginning of value?先看输入是不是 []byte 或 string
json.Unmarshal 只接受 []byte,如果传了 string 会直接 panic 报这个错——因为 Go 把 string 当作字节序列处理,但底层类型不匹配。
- 常见误操作:
json.Unmarshal(`{"name":"a"}`, &u)→ 字符串字面量是string类型 - 修复方式:强制转
[]byte:json.Unmarshal([]byte(`{"name":"a"}`), &u) - 从 HTTP 响应读取时,
resp.Body返回的是io.ReadCloser,需用io.ReadAll得到[]byte,不是直接传给Unmarshal
时间字段解析总出错?别硬扛,用 time.Time + 自定义 UnmarshalJSON
标准库的 time.Time 只认 RFC 3339 格式(如 "2024-01-01T12:00:00Z"),但现实接口五花八门:"2024-01-01"、"1704081600"、"2024-01-01 12:00:00" 全都不支持。
立即学习“go语言免费学习笔记(深入)”;
- 不要试图用
string接再手动转——破坏类型安全,容易漏判 - 正解:定义自定义类型,实现
UnmarshalJSON([]byte) error方法,内部按多种格式尝试解析 - 注意:该方法里不能再调
json.Unmarshal到自身,会无限递归;要用json.Unmarshal到临时string或float64再转
&,或者 struct tag 拼错一个字母——错误不报,数据就是空的,得逐层打日志看 len(data) 和字段值。别嫌烦,加个 fmt.Printf("%+v", u) 有时比读文档快。










