全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何使用Golang encoding/json解析JSON_Golang encoding/json解析与序列化示例

Go 的 encoding/json 包要求结构体字段导出(首字母大写)才能解析,非导出字段被静默跳过;需用 json:"key" 标签显式映射,支持蛇形转驼峰但有限制;数组/对象须严格对应切片/struct;空值处理推荐 *T 或 json.RawMessage;混合类型应先用 map[string]json.RawMessage 延迟解析。

Go 的 encoding/json 包能直接将 JSON 映射为结构体,但前提是字段名匹配且导出(首字母大写),否则解析会静默失败或字段为空。

结构体字段必须导出才能被 json.Unmarshal 处理

Go 的反射机制无法访问非导出字段(小写开头),json.Unmarshal 会跳过它们,不报错也不赋值。

  • 确保结构体字段首字母大写,例如 UserName 而非 userName
  • json 标签显式指定 JSON 键名,大小写无关: UserName string `json:"user_name"`
  • 如果 JSON 键是 "user_id",而结构体字段是 UserID int,不加标签也能解析成功(Go 默认做蛇形转驼峰),但这是有限制的:仅支持简单下划线分隔,不支持多下划线或数字混排(如 "user_id_v2" 不会自动转成 UserIDV2

处理嵌套对象与切片时,类型必须严格对应

JSON 数组必须映射为 Go 切片([]T),JSON 对象必须映射为 struct 或 map[string]interface{};类型错配会导致 json.Unmarshal 返回 invalid charactercannot unmarshal object into Go value of type []xxx 类错误。

  • 嵌套结构体需定义对应子 struct,不能用 interface{} 除非你后续手动断言
  • JSON 中可能缺失的字段,建议用指针类型(如 *string)或加 omitempty 标签避免零值干扰
  • 若不确定某字段是对象还是字符串(如某些 API 返回 "data": {}"data": "null"),优先用 json.RawMessage 延迟解析

反序列化空值、null 和缺失字段的差异

JSON 中的 null、字段不存在、空字符串,在 Go 结构体中表现不同,直接影响业务逻辑判断。

  • string 字段遇到 JSON null → 解析失败(invalid character 'n' looking for beginning of value),除非字段类型是 *string
  • *string 遇到 null → 指针为 nil;遇到缺失字段 → 也是 nil;二者无法区分,需靠业务约定或额外字段标识
  • sql.NullString 可区分 Valid == false(null 或缺失)和 Valid == true && String == ""(空字符串),适合对接数据库场景
type User struct {
    ID       int64  `json:"id"`
    Name     string `json:"name"`
    Avatar   *string `json:"avatar,omitempty"`
    Metadata json.RawMessage `json:"metadata"`
}

data := []byte(`{"id": 123, "name": "alice", "avatar": null}`)
var u User
err := json.Unmarshal(data, &u)
// u.Avatar == nil,u.Metadata == json.RawMessage("null") —— 注意:RawMessage 不会解析,保留原始字节

真正麻烦的是混合类型字段(比如某个字段有时是对象、有时是字符串),这时候别硬套 struct,先用 map[string]json.RawMessage 提取再按需解析,否则容易 panic 或丢数据。


# js  # json  # go  # golang  # 字节  # sql  # String  # Object  # NULL  # for  # 字符串  # 结构体  # int  # 指针  # 指针类型  # Struct  # Interface  # 切片  # nil  # map  # 对象  # 数据库  # 下划线  # 首字母  # 先用  # 跳过  # 的是  # 也不  # 是有  # 也能  # 空字符串  # 不存在 


相关文章: 如何快速搭建自助建站会员专属系统?  如何用低价快速搭建高质量网站?  网站制作说明怎么写,简述网页设计的流程并说明原因?  公司网站设计制作厂家,怎么创建自己的一个网站?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  如何在腾讯云服务器快速搭建个人网站?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  建站主机选购指南与交易推荐:核心配置解析  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  电商平台网站制作流程,电商网站如何制作?  如何在阿里云域名上完成建站全流程?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  c# await 一个已经完成的Task会发生什么  如何通过二级域名建站提升品牌影响力?  如何通过西部数码建站助手快速创建专业网站?  如何选择PHP开源工具快速搭建网站?  建站主机如何选?高性价比方案全解析  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  建站之星各版本价格是多少?  如何挑选高效建站主机与优质域名?  如何通过多用户协作模板快速搭建高效企业网站?  如何快速建站并高效导出源代码?  如何快速生成橙子建站落地页链接?  如何高效配置IIS服务器搭建网站?  山东网站制作公司有哪些,山东大源集团官网?  非常酷的网站设计制作软件,酷培ai教育官方网站?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  制作公司内部网站有哪些,内网如何建网站?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  建站之星代理如何获取技术支持?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  如何在香港免费服务器上快速搭建网站?  javascript基本数据类型及类型检测常用方法小结  如何在宝塔面板中修改默认建站目录?  装修招标网站设计制作流程,装修招标流程?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  建站主机选虚拟主机还是云服务器更好?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  如何配置支付宝与微信支付功能?  如何撰写建站申请书?关键要点有哪些?  建设网站制作价格,怎样建立自己的公司网站?  定制建站是什么?如何实现个性化需求?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  韩国服务器如何优化跨境访问实现高效连接?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  建站之星免费模板:自助建站系统与智能响应式一键生成  如何通过虚拟主机快速搭建个人网站?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。