如何在 Go 中正确解析 JSON 数组与单个 JSON 对象

发布时间 - 2026-01-31 00:00:00    点击率:

本文详解 go 语言中解析 json 数组与单对象的常见误区,重点说明结构体定义、反序列化方式及输入格式匹配原则,并提供可运行示例与实用建议。

在 Go 中解析 JSON 时,输入 JSON 的实际结构必须与 Go 反序列化目标类型严格一致——这是绝大多数 json.Unmarshal 失败的根本原因。以问题中的数据为例:

[
  {
    "ShaId": "adf56a4d",
    "Regions": [
      { "Name": "us-east-1a" }
    ]
  }
]

这是一个 JSON 数组([]object),因此必须使用切片([]ShaInfo)接收;若错误地用单个结构体变量(如 var data ShaInfo)去解析该数组,json.Unmarshal 将返回 invalid character '[' looking for beginning of value 或类似错误。

✅ 正确做法:按 JSON 结构定义 Go 类型并匹配解码目标

首先定义清晰、可导出的结构体(字段首字母大写):

type Region struct {
    Name string `json:"Name"`
}

type ShaInfo struct {
    ShaId   string  `json:"ShaId"`
    Regions []Region `json:"Regions"`
}

然后根据 JSON 输入选择对应解码

方式:

▪ 场景一:输入是 JSON 数组(推荐用于批量数据)

content := `[{"ShaId": "adf56a4d", "Regions": [{"Name": "us-east-1a"}]}]`

var results []ShaInfo
if err := json.Unmarshal([]byte(content), &results); err != nil {
    log.Fatal("解析 JSON 数组失败:", err)
}
fmt.Printf("解析成功,共 %d 条记录: %+v\n", len(results), results)
// 输出: 解析成功,共 1 条记录: [{ShaId:adf56a4d Regions:[{Name:us-east-1a}]}]

▪ 场景二:输入是单个 JSON 对象(无需方括号)

content := `{"ShaId": "adf56a4d", "Regions": [{"Name": "us-east-1a"}]}`

var single ShaInfo
if err := json.Unmarshal([]byte(content), &single); err != nil {
    log.Fatal("解析单个对象失败:", err)
}
fmt.Printf("单对象解析结果: %+v\n", single)
// 输出: 单对象解析结果: {ShaId:adf56a4d Regions:[{Name:us-east-1a}]}

⚠️ 关键注意事项

  • 结构体字段必须导出(首字母大写)且含 json 标签,否则 json 包无法访问和赋值;
  • json.Unmarshal 的第二个参数必须是指针(&variable),否则无效果;
  • 不要强行“套用”切片类型解析单对象,也不要用单结构体解析数组——Go 不会自动转换容器类型;
  • 若上游 API 返回格式不确定(有时单对象、有时数组),可先用 json.RawMessage 做预判,或统一要求服务端返回标准数组格式(更健壮);
  • 使用 Go Playground 快速验证时,请确保 content 字符串与真实响应完全一致(包括空格、引号、嵌套层级)。

掌握“JSON 形态 → Go 类型 → Unmarshal 目标”三者严格对应的原则,即可彻底避免 Unable to parse JSON array 类错误。


# js  # json  # go  # ai  # golang  # Array  # Object  # for  # 字符串  # 结构体  # 指针  # var  # 切片  # 对象  # 首字母  # 这是  # 也不  # 序列化  # 这是一个  # 第二个  # 要用  # 为例  # 不确定  # 先用 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 简历没回改:利用AI润色让你的文字更专业  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  中国移动官方网站首页入口 中国移动官网网页登录  香港服务器部署网站为何提示未备案?  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  Laravel如何处理和验证JSON类型的数据库字段  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  如何在阿里云购买域名并搭建网站?  网站制作软件有哪些,制图软件有哪些?  Laravel如何为API生成Swagger或OpenAPI文档  Laravel Docker环境搭建教程_Laravel Sail使用指南  Android 常见的图片加载框架详细介绍  济南网站建设制作公司,室内设计网站一般都有哪些功能?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  Laravel如何使用Blade组件和插槽?(Component代码示例)  魔方云NAT建站如何实现端口转发?  Laravel如何使用Service Container和依赖注入?(代码示例)  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  微信推文制作网站有哪些,怎么做微信推文,急?  手机软键盘弹出时影响布局的解决方法  网站制作价目表怎么做,珍爱网婚介费用多少?  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  如何用y主机助手快速搭建网站?  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  奇安信“盘古石”团队突破 iOS 26.1 提权  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  香港服务器租用每月最低只需15元?  网站建设保证美观性,需要考虑的几点问题!  如何在万网开始建站?分步指南解析  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  焦点电影公司作品,电影焦点结局是什么?  如何在云主机上快速搭建网站?  iOS正则表达式验证手机号、邮箱、身份证号等  Python面向对象测试方法_mock解析【教程】  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  免费网站制作appp,免费制作app哪个平台好?  如何快速生成橙子建站落地页链接?  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  详解Android——蓝牙技术 带你实现终端间数据传输  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】