如何正确解析包含多个 JSON 对象的 JSON 数组
发布时间 - 2026-02-03 00:00:00 点击率:次本文详解如何在 go 中准确解析嵌套在顶层字段中的 json 对象数组,包括结构体字段名与 json 键的精确映射、类型匹配(如 `int64` vs `string`)、以及安全遍历解析后数据的完整实践。
在 Go 中解析 JSON 数组时,常见错误往往源于结构体字段标签(struct tags)与实际 JSON 键名不一致,或数据类型声明不匹配(例如将数字型 ID 声明为 string)。以你提供的示例为例,原始 JSON 的顶层字段是 "array",而非 "createUserArray";且每个对象中键名为 "entity_title",但结构体却误写为 "entity_title_name" —— 这会导致解码失败或字段为空。
首先,修正结构体定义,确保 json 标签严格对应 JSON 字段名,并选用合适的数据类型:
type MsgCreateUserArray struct {
CreateUser []MsgCreateUserJson `json:"array"` // ✅ 匹配 JSON 中的 "array" 字段
}
type MsgCreateUserJson struct {
EntityTitle string `json:"entity_title"` // ✅ 原始键名,非 entity_title_name
EntityOrgName string `json:"entity_org_name"`
PossibleUserName string `json:"possible_user_name"`
PosibbleUserEmail string `json:"posibble_user_email"` // ⚠️ 注意:JSON 中拼写为 "posibble"(疑似 typo,需按实际保留)
UserPositionTitle string `json:"user_position_title"`
MsgBodyID int64 `json:"msg_body_id,omitempty"` // ✅ msg_body_id 是整数,用 int64 更安全(避免溢出)
}? 关键修正点说明:json:"array" → 正确绑定顶层数组字段;字段名 EntityTitle 对应 "entity_title",而非 "entity_title_name";MsgBodyID 使用 int64 并添加 omitempty(因 JSON 中该值无小数,且 omitempty 在零值时可忽略序列化,不影响解析);拼写差异(如 "posibble_user_email")必须如实反映在 tag 中——Go 解析器严格区分大小写与拼写。
接下来,在 HTTP 处理函数中完成解析与遍历:
func parseJson(rw http.ResponseWriter, request *http.Request) { defer request.Body.Close() // ✅ 防止资源泄漏 decoder := json.NewDecoder(request.Body) var payload MsgCreateUserArray if err := decoder.Decode(&payload); err != nil { http.Error(rw, "Invalid JSON: "+err.Error(), http.StatusBadRequest) return } // ✅ 安全遍历解析后的对象切片 for i, user := range payload.CreateUser { log.Printf("Item %d: %s @ %s, position: %s, ID: %d", i+1, user.PossibleUserName, user.EntityTitle, user.UserPositionTitle, user.MsgBodyID, ) // 此处可对每个 user 执行业务逻辑:存入 DB、校验邮箱、触发通知等 } rw.WriteHeader(http.StatusOK) rw.Write([]byte("OK")) }
? 注意事项与最佳实践:
- 始终调用 request.Body.Close()(建议用 defer),避免连接复用时的潜在问题;
- 使用 http.Error() 返回清晰的客户端错误,而非 panic —— 生产环境应避免 panic 中断服务;
- 若 msg_body_id 可能缺失,omitempty 仅影响序列化;解析时若字段不存在,int64 将默认为 0,必要时可改用 *int64 表示可空;
- HTML 转义邮箱(如 [email protected])属于前端防护(Cloudflare Email Protection),后端解析得到的是完整 HTML 字符串;如需提取纯邮箱,应使用 html.UnescapeString() 或正则清洗,切勿直接渲染到页面以防 XSS。
通过以上结构体修正 + 类型对齐 + 安全遍历,你即可稳健地从 HTTP 请求中提取并处理任意长度的 JSON 对象数组。
# html
# js
# 前端
# json
# go
# usb
# 后端
# ai
# 邮箱
# golang
# xss
# 数据类型
# String
# Array
# Error
# 字符串
# 结构体
# protected
# Struct
# 对象
# href
# http
# 遍历
# 而非
# 字段名
# 键名
# 的是
# 序列化
# 不存在
# 为例
# 如需
# 这会
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
Swift中swift中的switch 语句
如何在服务器上配置二级域名建站?
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
微信小程序 五星评分(包括半颗星评分)实例代码
EditPlus中的正则表达式 实战(2)
C#如何调用原生C++ COM对象详解
如何利用DOS批处理实现定时关机操作详解
JavaScript模板引擎Template.js使用详解
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
如何快速使用云服务器搭建个人网站?
香港服务器WordPress建站指南:SEO优化与高效部署策略
网站制作报价单模板图片,小松挖机官方网站报价?
如何在阿里云高效完成企业建站全流程?
Python文本处理实践_日志清洗解析【指导】
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
如何快速上传自定义模板至建站之星?
网站制作免费,什么网站能看正片电影?
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
长沙企业网站制作哪家好,长沙水业集团官方网站?
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
Python进程池调度策略_任务分发说明【指导】
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
Laravel storage目录权限问题_Laravel文件写入权限设置
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
如何在香港服务器上快速搭建免备案网站?
如何自定义建站之星模板颜色并下载新样式?
如何在建站之星网店版论坛获取技术支持?
智能起名网站制作软件有哪些,制作logo的软件?
Internet Explorer官网直接进入 IE浏览器在线体验版网址
Android 常见的图片加载框架详细介绍
Claude怎样写约束型提示词_Claude约束提示词写法【教程】
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
javascript日期怎么处理_如何格式化输出
桂林网站制作公司有哪些,桂林马拉松怎么报名?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
如何在Windows 2008云服务器安全搭建网站?
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
北京网站制作的公司有哪些,北京白云观官方网站?
如何在建站主机中优化服务器配置?
制作旅游网站html,怎样注册旅游网站?
html如何与html链接_实现多个HTML页面互相链接【互相】
MySQL查询结果复制到新表的方法(更新、插入)
node.js报错:Cannot find module 'ejs'的解决办法
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
专业商城网站制作公司有哪些,pi商城官网是哪个?
如何快速搭建个人网站并优化SEO?


