如何使用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主机快速搭建个人网站?
在线制作视频网站免费,都有哪些好的动漫网站?


, &u)
if err != nil {
log.Fatal(err)
}
// u.ID == 1, u.Name == "Alice", u.Active == true