
本文详解如何使用 Go 的 json.Unmarshal 解析含嵌套数组的 JSON 数据,重点纠正结构体字段引用错误,并提供可运行的完整示例与关键注意事项。
本文详解如何使用 go 的 `json.unmarshal` 解析含嵌套数组的 json 数据,重点纠正结构体字段引用错误,并提供可运行的完整示例与关键注意事项。
在 Go 中解析类似 {"foo": [{"bar": 1, "baz": 2}, {"bar": 4, "baz": 25}], "more": "text"} 这样的嵌套 JSON,核心在于定义语义清晰、标签准确的结构体,并确保解码后通过正确的字段路径访问数据。
首先,需定义两个嵌套结构体:外层结构体对应整个 JSON 对象,内层结构体对应 foo 数组中的每个元素:
type FooStruct struct {
Bar int `json:"bar"`
Baz int `json:"baz"`
}
type ResponseStruct struct {
More string `json:"more"`
Foo []FooStruct `json:"foo"` // 注意:字段名是 Foo,不是 FooStruct
}✅ 关键点:json:"foo" 标签将 JSON 中的 "foo" 键映射到 Go 结构体的 Foo 字段(首字母大写,导出字段),而 FooStruct 是类型名,不能作为字段名使用。
接下来执行解码:
jsonData := []byte(`{"foo": [{"bar": 1, "baz": 2}, {"bar": 4, "baz": 25}], "more": "text"}`)
var response ResponseStruct
err := json.Unmarshal(jsonData, &response)
if err != nil {
log.Fatal("JSON 解析失败:", err)
}
// 正确访问方式:response.Foo[0].Bar
fmt.Printf("第一个 bar 值: %d\n", response.Foo[0].Bar) // 输出: 1
fmt.Printf("全部 foo 元素: %+v\n", response.Foo) // 输出: [{Bar:1 Baz:2} {Bar:4 Baz:25}]
fmt.Printf("more 字段: %s\n", response.More) // 输出: text⚠️ 常见错误示例(应避免):
// ❌ 错误:ResponseStruct 中没有名为 FooStruct 的字段
// fmt.Printf("%+v", contentHtml.FooStruct[0].Bar)
// ✅ 正确:通过已声明的字段名 Foo 访问切片
// response.Foo[0].Bar? 补充注意事项:
- 所有用于 JSON 解析的结构体字段必须是导出字段(首字母大写),否则 json 包无法反射赋值;
- 若 JSON 中某字段可能缺失或类型不固定(如 null 或字符串混入数字),建议使用指针(*int)或 interface{} + 类型断言,或启用 json.RawMessage 延迟解析;
- 使用 json.MarshalIndent 可辅助调试输出格式化 JSON,验证结构体是否与预期一致;
- 在生产环境中,建议配合 errors.Is(err, json.SyntaxError) 等做细粒度错误处理,提升可观测性。
掌握结构体标签与字段命名的一致性,是 Go JSON 解析稳健性的基石。只要结构体定义与 JSON 模式对齐,Unmarshal 即可自动完成深层嵌套数组的映射——无需手动遍历或额外解析逻辑。


















