
本文介绍如何使用 go 的 `encoding/json` 包解析形如 `[{"key1":"val1"},{"key2":"val2"}]` 的 json 数组,并将其扁平化合并为一个 `map[string]string`,适用于词典、配置项等场景。
在 Go 中处理 JSON 时,若原始数据是多个独立对象组成的数组(例如 [{"Cat":"small animal"},{"Cow":"Big animal"}]),而非单个对象或标准键值对映射,直接解码为 map[string]string 会失败——因为 JSON 数组无法直接映射到 Go 的 map 类型。正确做法是:先将 JSON 解码为 []map[string]string(字符串映射的切片),再遍历合并到目标 map 中。
以下是一个完整、可运行的示例:
package main
import (
"encoding/json"
"fmt"
"log"
)
func main() {
// 假设这是从 HTTP 响应、文件或 API 获取的 JSON 字节数组
jsonText := []byte(`[
{"Cat": "small animal"},
{"Cow": "Big animal"},
{"Dog": "loyal companion"}
]`)
var rawList []map[string]string
if err := json.Unmarshal(jsonText, &rawList); err != nil {
log.Fatal("JSON 解析失败:", err)
}
// 合并所有子 map 到一个统一的 map
wordMap := make(map[string]string)
for _, item := range rawList {
for key, value := range item {
wordMap[key] = value // 若存在重复 key,后出现的值将覆盖前者
}
}
fmt.Printf("合并后的词典: %+v\n", wordMap)
// 输出: 合并后的词典: map[Cat:small animal Cow:Big animal Dog:loyal companion]
}✅ 关键要点说明:
- []map[string]string 是解析此类“对象数组”的标准中间类型,每个数组元素是一个独立的键值对映射;
- 合并逻辑需手动遍历,Go 不提供自动扁平化;
- 若原始 JSON 实际为 {...}(即外层是对象而非数组),则需先确认结构——常见错误是误将数组格式的 JSON 当作单个对象解析,导致 json: cannot unmarshal object into Go value of type []map[string]string 错误;
- 如需健壮性,建议添加字段校验(例如确保每个子对象仅含一个键值对)或错误恢复逻辑;
- 若数据量极大,可考虑流式解析(如 json.Decoder 配合 Token())以降低内存占用,但对常规词典规模,上述方式简洁高效。
最终得到的 map[string]string 可直接用于快速查词、配置注入或进一步序列化,是 Go 中处理非标准 JSON 结构的典型实践。










