JSON反序列化失败主因有四:字段名大小写不匹配需用json tag显式映射;数字默认解析为float64,须类型检查再断言;time.Time需RFC3339格式或自定义UnmarshalJSON;启用DisallowUnknownFields时遇未知字段会报错。
JSON反序列化时字段名不匹配导致解析失败
Go 的 encoding/json 默认按结构体字段的**导出名(首字母大写)**映射 JSON 键,且严格区分大小写。如果 JSON 中是 "user_name",但结构体字段叫 UserName 且没加 tag,它会去匹配 "UserName" —— 显然失败,对应字段保持零值。
解决方法是显式声明 json tag:
type User struct {
ID int `json:"id"`
UserName string `json:"user_name"`
Email string `json:"email,omitempty"`
}
-
omitempty表示该字段为空值(""、0、nil等)时不参与序列化,但反序列化时不影响接收 - tag 中不能有空格,
`json:"user_name, omitempty"`是错的,逗号后不能有空格 - 若 JSON 键含特殊字符(如
@type),tag 必须完整写出:`json:"@type"`
嵌套对象或数组解析时 panic: interface conversion
常见于用 map[string]interface{} 或 []interface{} 做通用解析后,直接类型断言子字段,比如:
data := map[string]interface{}{}
json.Unmarshal(b, &data)
name := data["name"].(string) // panic! 如果实际是 nil 或 float64
JSON 数字默认被解析为 float64,字符串才是 string,布尔是 bool,null 是 nil —— 没有自动类型推导。