Go语言如何将JSON字符串解析为结构体_Golang中JSON反序列化实战
结构体字段没被赋值?八成是字段没导出、没传指针,或者标签写错了。这事儿其实挺常见的,很多新手甚至写过一段时间的开发者,都会在这几个地方栽跟头。今天咱们就来把这些问题彻底捋清楚。 结构体字段必须首字母大写才能被反序列化 小写字母开头的字段(比如 name string)在 json.Unmarshal
结构体字段没被赋值?八成是字段没导出、没传指针,或者标签写错了。这事儿其实挺常见的,很多新手甚至写过一段时间的开发者,都会在这几个地方栽跟头。今天咱们就来把这些问题彻底捋清楚。

结构体字段必须首字母大写才能被反序列化
小写字母开头的字段(比如 name string)在 json.Unmarshal 时会被完全忽略——不报错、不警告,字段保持零值。这绝对是最隐蔽也最常踩的坑。
- 把
name改成Name,确保字段可导出 json标签里的键名可以小写,不影响映射:`json:"user_name"`- 如果结构体来自第三方包且无法改字段名,只能绕过结构体,先用
map[string]interface{}接收再手动赋值
json.Unmarshal 必须传指针,否则字段不会更新
传值调用(json.Unmarshal(data, p))编译能过,但解析成功后 p 仍是空结构体——因为 Unmarshal 写的是副本,不是原变量。
- 正确写法:
err := json.Unmarshal(data, &p) - 对切片也一样:
var users []User; json.Unmarshal(data, &users) - 用
new(T)或&T{}初始化后传指针,别传零值变量本身
json 标签写错会导致字段映射失败
标签格式错误(比如漏双引号、冒号写成等号、拼写错误)会让 Unmarshal 找不到对应字段,静默跳过。
- 正确格式:
`json:"id"`或`json:"user_id,omitempty"`,双引号不能少 json:"host"和json:host(无引号)效果完全不同,后者会被忽略omitempty只影响序列化,不影响反序列化;但它可能掩盖“字段确实为 0”还是“压根没传”的业务逻辑差异
嵌套结构或类型不确定时别硬塞进固定结构体
当 JSON 的某个字段可能是对象、数组或 null,直接定义成 type Address struct{...} 并嵌入,容易 panic 或字段为空。
- 先用
Data json.RawMessage `json:"data"`拿原始字节,避免提前解析失败 - 后续根据
len(Data) > 0和首字符({/[/n)判断类型,再分发解析 map[string]interface{}灵活但类型不安全,深层嵌套时result["data"].(map[string]interface{})["items"].([]interface{})容易 panic,建议仅用于顶层路由分发或调试
真正难的不是写对语法,而是确认字段“真的进来了”——反序列化后立刻检查关键字段是否仍为零值,比读文档更可靠;打印 len(data) 和 string(data) 前几字符,比猜结构更直接。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















