如何正确解析包含多个 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.ResponseWr

iter, 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


相关推荐: Laravel集合Collection怎么用_Laravel集合常用函数详解  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  如何在Windows环境下新建FTP站点并设置权限?  nodejs redis 发布订阅机制封装实现方法及实例代码  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  如何做网站制作流程,*游戏网站怎么搭建?  如何快速生成橙子建站落地页链接?  JavaScript数据类型有哪些_如何准确判断一个变量的类型  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  EditPlus中的正则表达式 实战(1)  微信小程序 require机制详解及实例代码  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  Laravel如何保护应用免受CSRF攻击?(原理和示例)  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  Laravel如何生成API文档?(Swagger/OpenAPI教程)  如何基于云服务器快速搭建个人网站?  如何在橙子建站中快速调整背景颜色?  网站页面设计需要考虑到这些问题  如何快速选择适合个人网站的云服务器配置?  JS去除重复并统计数量的实现方法  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  如何在宝塔面板创建新站点?  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  音乐网站服务器如何优化API响应速度?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  Laravel如何发送系统通知?(Notification渠道示例)  深入理解Android中的xmlns:tools属性  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  Laravel distinct去重查询_Laravel Eloquent去重方法  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  Bootstrap整体框架之CSS12栅格系统  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  利用 Google AI 进行 YouTube 视频 SEO 描述优化  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  香港服务器部署网站为何提示未备案?  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  高性价比服务器租赁——企业级配置与24小时运维服务  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】