如何在 Go 中解析包含多个键值对对象的 JSON 数组并合并为单一映射

10次阅读

如何在 Go 中解析包含多个键值对对象的 JSON 数组并合并为单一映射

本文介绍如何使用 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("合并后的词典: %+vn", 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 结构的典型实践。

text=ZqhQzanResources