如何在 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扩展教程【方法】

