Go解析嵌套JSON需严格对齐struct层级且所有字段首字母大写,否则静默忽略;json:"a.b"无效,须用嵌套struct;连字符键需显式tag;动态键或混型数组应使用map或json.RawMessage。

Go 解析嵌套 JSON 不能靠猜路径,必须让 struct 层级和 JSON 层级严格对齐;否则字段全是零值,还不报错。
struct 字段必须首字母大写,否则静默忽略
encoding/json 只能读写导出字段。小写字母开头的字段(如 name string)哪怕写了 json:"name" 标签,也不会被赋值,结果永远是空字符串、0 或 nil。
- ✅ 正确:
Name string `json:"name"` - ❌ 错误:
name string `json:"name"` - ⚠️ 嵌套 struct 里的字段也得全部大写,否则内层照样为空
- 常见现象:解析后
Gateways切片长度为 0,Port是 0 —— 很可能只是字段没导出
json:"a.b" 这种标签完全无效
Go 的 json.Unmarshal 不支持点号路径语法。写 json:"data.items" 不会跳过 data 层直接取 items,它只在当前层级匹配键名。
- JSON 是
{"data":{"items":[{"id":1}]}}→ 必须定义两层 struct:Data DataResp `json:"data"`,再在DataResp里放Items []Item `json:"items"` - ❌ 别把
data当“无意义包裹”强行扁平化,否则字段全丢 - ✅ 推荐保留容器层命名(如
Data、Response),比硬展开更稳、更易维护
键名含连字符或大小写不一致?必须显式写 json tag
Go 默认按首字母大写自动转小写匹配(Name → "name"),但遇到 "max-retries"、"APIVersion" 这类键,不写 tag 就彻底失联。
立即学习“go语言免费学习笔记(深入)”;
MaxRetries int `json:"max-retries"`ApiVersion string `json:"APIVersion"`- ⚠️ 注意:JSON 键必须双引号包裹,否则
json.Unmarshal直接 panic - 工具如
json-to-go可帮你生成基础 struct,但一定要手动补全所有json:"xxx"标签
动态键或混型数组?别硬解,用 map 或 json.RawMessage
当 JSON 的顶层键不固定(比如学院名是变量),或者数组里元素类型不一致([{"type":"user"},{"type":"admin","level":9}]),强行定义 struct 会失败。
- ✅ 动态键:用
map[string]map[string]string,比 struct 更自然 - ✅ 混型数组:字段声明为
Items []json.RawMessage `json:"items"`,再遍历每个json.RawMessage,先取type字段判断,再二次json.Unmarshal到对应 struct - ⚠️
json.RawMessage是[]byte别名,可多次解析,但别反复对同一段数据调用Unmarshal - ❌ 别用
map[string]interface{}硬解嵌套数组——interface{}不支持[0],编译直接报错
最常被忽略的其实是字段导出规则:不是“写了 tag 就万事大吉”,而是“每个嵌套层里的每个字段都得大写”。哪怕只漏一个 id 写成小写,那一整块数据就废了,还查不出错在哪。


















