如何使用Golang encoding/json解析JSON_序列化和反序列化结构体

发布时间 - 2025-12-26 00:00:00    点击率:
Go语言encoding/json包通过导出字段和json标签实现JSON编解码:导出字段(首字母大写)才能被处理,json:"name"自定义键名,omitempty忽略零值,"-"忽略字段,",string"字符串化编解码;需传指针给Unmarshal并检查错误,Marshal支持格式化输出;嵌套结构、切片、map及map[string]interface{}均自动递归处理。

Go 语言的 encoding/json 包提供了简洁、高效的方式处理 JSON 序列化(struct → JSON)和反序列化(JSON → struct)。关键在于结构体字段的可见性(首字母大写)、标签(json:"field_name")控制映射关系,以及正确处理嵌套、空值和类型兼容性。

结构体定义与 JSON 标签

只有导出字段(首字母大写)才能被 JSON 包读写。使用 json 标签可自定义字段名、忽略字段或控制空值行为:

  • json:"name":指定 JSON 中对应的键名
  • json:"name,omitempty":该字段为空值(零值)时不输出到 JSON
  • json:"-":完全忽略该字段
  • json:",string":将数字/布尔等类型以字符串形式编解码(如 "123"int

示例:

type User struct {
    ID     int    `json:"id"`
    Name   string `json:"name"`
    Email  string `json:"email,omitempty"`
    Active bool   `json:"active,string"` // 接收 "true"/"false" 字符串
    Secret string `json:"-"`
}

反序列化:JSON 字符串 → 结构体

json.Unmarshal 将字节切片([]byte)解析为结构体指针。务必传入指针,否则无效果;并检查错误:

data := []byte(`{"id": 1, "name": "Alice", "active": "true"}`)
var u User
err := json.Unmarshal(data, &u)
if err != nil {
    log.Fatal(err)
}
// u.ID == 1, u.Name == "Alice", u.Active == true

注意:
- JSON 键名不区分大小写,但需与标签完全匹配(除非手动处理)
- 如果 JSON 中有额外字段而结构体没有对应字段,默认忽略
- 类型不匹配(如字符串赋给 int)会返回错误

序列化:结构体 → JSON 字符串

json.Marshal 将结构体转为 []byte。推荐用 json.MarshalIndent 生成格式化 JSON(便于调试):

u := User{ID: 2, Name: "Bob", Active: true}
b, err := json.Marshal(u)
// → {"id":2,"name":"Bob","active":"true"}

b, err := json.MarshalIndent(u, "", " ") // → {
"id": 2,
"name": "Bob",
"active": "true"
}

如果字段是 nil 指针或零值且带 omitempty,不会出现在结果中。

处理嵌套、切片与 map

结构体字段可以是其他结构体、切片或 map,encoding/json 会自动递归处理:

type Post struct {
    Title string   `json:"title"`
    Tags  []string `json:"tags"`
    Author *User   `json:"author,omitempty"`
}

type Blog struct { Posts []Post json:"posts" Meta map[string]interface{} json:"meta" }

反序列化时,只要 JSON 数据结构匹配,就能正确填充。map[string]interface{} 可用于动态或未知结构的字段(需运行时类型断言)。


# js  # json  # go  # golang  # go语言  # 字节  # ai  # 格式化输出  # String  # 字符串  # 结构体  # 递归  # int  # 指针  # 数据结构  # Struct  # Interface 


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


相关推荐: 如何在服务器上配置二级域名建站?  如何在景安服务器上快速搭建个人网站?  5种Android数据存储方式汇总  微信小程序 闭包写法详细介绍  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  Bootstrap整体框架之JavaScript插件架构  实例解析angularjs的filter过滤器  如何快速搭建支持数据库操作的智能建站平台?  如何快速生成专业多端适配建站电话?  Android GridView 滑动条设置一直显示状态(推荐)  网站页面设计需要考虑到这些问题  ,交易猫的商品怎么发布到网站上去?  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  Laravel如何使用查询构建器?(Query Builder高级用法)  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Swift中swift中的switch 语句  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  用yum安装MySQLdb模块的步骤方法  在centOS 7安装mysql 5.7的详细教程  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  Laravel用户密码怎么加密_Laravel Hash门面使用教程  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  Laravel如何使用Gate和Policy进行授权?(权限控制)  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  打造顶配客厅影院,这份100寸电视推荐名单请查收  如何续费美橙建站之星域名及服务?  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  企业网站制作这些问题要关注  Laravel如何使用Vite进行前端资源打包?(配置示例)  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  如何在建站之星绑定自定义域名?  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  Swift中循环语句中的转移语句 break 和 continue  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  Swift中switch语句区间和元组模式匹配  linux写shell需要注意的问题(必看)  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  iOS发送验证码倒计时应用  中国移动官方网站首页入口 中国移动官网网页登录  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  如何自定义建站之星模板颜色并下载新样式?  Python文件流缓冲机制_IO性能解析【教程】  *服务器网站为何频现安全漏洞?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  北京网站制作公司哪家好一点,北京租房网站有哪些?  如何用VPS主机快速搭建个人网站?  在线制作视频网站免费,都有哪些好的动漫网站?