
本文详解 Go 语言中如何正确解析形如 {"Cookies": [{"name1":"Value1"}, ...]} 的 JSON 字符串,涵盖 JSON 格式校验、结构体字段导出规则、嵌套 map 切片定义及遍历技巧。
本文详解 go 语言中如何正确解析形如 {"cookies": [{"name1":"value1"}, ...]} 的 json 字符串,涵盖 json 格式校验、结构体字段导出规则、嵌套 map 切片定义及遍历技巧。
在 Go 中使用 encoding/json 解析 JSON 数据时,初学者常因三个关键点失败:JSON 语法错误、结构体字段未导出、数据结构与 JSON 不匹配。以解析 cookies 为例,原始代码存在多重问题——不仅 JSON 字符串不符合标准(如使用方括号包裹键值对、缺少引号、误用数组语法),结构体字段 cookies 为小写未导出,且类型 map[string]string 无法匹配实际的 JSON 数组结构。
首先,修正 JSON 格式。原始字符串:
{ Cookies: {
["name1": "Value1"],
["name2": "Value2"],
["name3": "Value3"]
}}
是非法的。合法 JSON 应为对象({})包含键 "Cookies",其值为对象数组([{}, {}, {}]),每个对象代表一组键值对。正确格式如下:
{"Cookies": [{"name1": "Value1"}, {"name2": "Value2"}, {"name3": "Value3"}]}
其次,Go 结构体字段必须首字母大写(导出) 才能被 json 包访问。cookies 是私有字段,Unmarshal 会静默忽略它。应改为导出字段 Cookies,并匹配 JSON 中的键名(通过 json:"Cookies" 标签显式绑定)。
最后,JSON 中 "Cookies" 对应的是数组([]),而非单个对象({}),因此结构体字段类型不能是 map[string]string,而应是 []map[string]string——即“字符串映射的切片”。
完整可运行示例:
package main
import (
"encoding/json"
"fmt"
)
type htmlDoc struct {
Cookies []map[string]string `json:"Cookies"`
}
func main() {
jsonString := `{"Cookies": [
{"name1": "Value1"},
{"name2": "Value2"},
{"name3": "Value3"}
]}`
var doc htmlDoc
if err := json.Unmarshal([]byte(jsonString), &doc); err != nil {
panic(err) // 实际项目中建议妥善处理错误
}
for _, cookieMap := range doc.Cookies {
for name, value := range cookieMap {
fmt.Printf("%s\t%s\n", name, value)
}
}
}
输出结果:
name1 Value1 name2 Value2 name3 Value3
⚠️ 注意事项:
- 若 cookies 数据结构固定(如总含
name和value字段),更推荐定义明确结构体(如type Cookie struct { Name, Value string }),提升类型安全与可读性; -
map[string]string适用于键名动态的场景,但会丢失字段顺序且无法静态校验; - 始终检查
json.Unmarshal返回的 error,避免静默失败; - JSON 键名区分大小写,
json标签中的字符串必须与 JSON 实际键完全一致(包括空格和大小写)。
掌握这三点——合法 JSON、导出字段、精准类型匹配——即可稳健解析各类嵌套 JSON 数据。











