
本文详解如何为 REST API 返回的嵌套 JSON 数据设计 Go 结构体,重点纠正常见 JSON 语法误读(如 {"Fruits": {[...]}} 的非法写法),并提供可直接运行的结构体定义、反序列化示例及验证方法。
本文详解如何为 rest api 返回的嵌套 json 数据设计 go 结构体,重点纠正常见 json 语法误读(如 `{"fruits": {[...]}}` 的非法写法),并提供可直接运行的结构体定义、反序列化示例及验证方法。
在 Go 中实现 JSON 反序列化(json.Unmarshal)的前提是:输入 JSON 必须是合法的 RFC 8259 格式。问题中给出的原始响应片段:
"Basket" : {
"Count": 1,
"Fruits": {[
{"Name":"Mango", "Season":"Summer"},
{"Name":"Fig", "Season":"Winter"}
]}
}
⚠️ 这不是有效 JSON —— {[...]} 是语法错误:花括号 {} 表示对象(key-value 映射),方括号 [] 表示数组,二者不可直接嵌套成 {[...]}。合法写法只有两种:
- ✅
{"Fruits": [...]}→ 表示"Fruits"是一个字段名,其值为 JSON 数组; - ✅
"Fruits": [...](作为对象内字段)→ 即标准嵌套对象中的数组字段。
因此,真实服务返回的 JSON 应为如下合法格式(已补全顶层对象):
{
"Basket": {
"Count": 1,
"Fruits": [
{"Name": "Mango", "Season": "Summer"},
{"Name": "Fig", "Season": "Winter"}
]
}
}
对应地,Go 结构体需严格匹配该嵌套层级:
type Response struct {
Basket Basket `json:"Basket"`
}
type Basket struct {
Count int `json:"Count"`
Fruits []Fruit `json:"Fruits"`
}
type Fruit struct {
Name string `json:"Name"`
Season string `json:"Season"`
}
✅ 关键点说明:
- 使用
json:"Basket"标签显式绑定字段名,避免大小写/命名差异; -
Basket字段为嵌套结构,而非直接将Count和Fruits提升至顶层 —— 否则无法解析"Basket"这一层; -
Fruits类型为[]Fruit(切片),与 JSON 数组[]完全对应,Go 的json包会自动处理。
完整可运行示例:
package main
import (
"encoding/json"
"fmt"
)
// 定义结构体(含 JSON 标签)
type Response struct {
Basket Basket `json:"Basket"`
}
type Basket struct {
Count int `json:"Count"`
Fruits []Fruit `json:"Fruits"`
}
type Fruit struct {
Name string `json:"Name"`
Season string `json:"Season"`
}
func main() {
jsonData := `{
"Basket": {
"Count": 1,
"Fruits": [
{"Name": "Mango", "Season": "Summer"},
{"Name": "Fig", "Season": "Winter"}
]
}
}`
var resp Response
if err := json.Unmarshal([]byte(jsonData), &resp); err != nil {
panic(err) // 如 JSON 非法,此处将报错:invalid character '{' looking for beginning of value
}
fmt.Printf("Count: %d\n", resp.Basket.Count)
for _, f := range resp.Basket.Fruits {
fmt.Printf("- %s (%s)\n", f.Name, f.Season)
}
}
? 注意事项:
- 若实际 API 返回的是非法 JSON(如
{[...]}),应优先联系后端修复,Go 无法解析语法错误的 JSON; - 不要尝试用
map[string]interface{}或自定义UnmarshalJSON绕过语法校验 —— 这掩盖了根本问题且降低可维护性; - 使用 JSONLint 或
jq等工具预验证响应体合法性; - 所有结构体字段若需参与 JSON 编解码,必须为导出字段(首字母大写),并推荐显式添加
json:标签以增强健壮性。
总结:Go 的 json 包严格遵循标准,建模前务必确认 JSON 合法性;结构体层级 = JSON 对象嵌套层级,切片类型 = JSON 数组,标签名 = JSON 键名 —— 三者对齐,反序列化自然水到渠成。











