新闻中心

如何用Golang使用encoding/json.Marshal和Unmarshal_Golang JSON序列化反序列化实践

2025-11-23
浏览次数:
返回列表
Go语言中encoding/json包用于JSON序列化和反序列化。1. json.Marshal将结构体转为JSON,通过json tag控制字段名,omitempty可忽略零值字段;2. json.Unmarshal将JSON解析到结构体,需传指针,缺失字段设为零值;3. 支持map和slice的转换,如map[string]interface{}转JSON及JSON数组转[]map[string]string;4. 注意事项:仅导出字段有效,可用string tag使数字以字符串编码,时间建议用RFC3339格式,多余JSON字段默认被忽略,数值解析为float64或int64。

如何用golang使用encoding/json.marshal和unmarshal_golang json序列化反序列化实践

在Go语言中,encoding/json 包提供了对JSON数据的序列化(Marshal)和反序列化(Unmarshal)支持。这是处理API请求、配置文件、数据存储等场景中最常用的功能之一。下面通过实际例子说明如何正确使用 json.Marshaljson.Unmarshal

1. 使用 json.Marshal 将结构体转为 JSON 字符串

json.Marshal 函数可以将 Go 中的数据结构(如结构体、map、slice等)转换为 JSON 格式的字节流。

示例代码:

package main
<p>import (
"encoding/json"
"fmt"
)</p><p>type User struct {
Name     string <code>json:"name"</code>
Age      int    <code>json:"age"</code>
Email    string <code>json:"email,omitempty"</code>
IsActive bool   <code>json:"is_active"</code>
}</p><p>func main() {
user := User{
Name:     "Alice",
Age:      30,
Email:    "alice@example.com",
IsActive: true,
}</p><pre class="brush:php;toolbar:false;">data, err := json.Marshal(user)
if err != nil {
    fmt.Printf("序列化失败: %v\n", err)
    return
}

fmt.Println(string(data)) // 输出: {"name":"Alice","age":30,"email":"alice@example.com","is_active":true}

}

说明:
- 结构体字段上的 json tag 控制字段在 JSON 中的名称。
- omitempty 表示如果字段为空(如零值),则不会出现在输出 JSON 中。
- 如果 Email 字段为空字符串,它将不会出现在最终 JSON 中。

2. 使用 json.Unmarshal 将 JSON 字符串解析为结构体

json.Unmarshal 可以将 JSON 数据解析回 Go 的数据结构。

示例代码:

func main() {
    jsonData := `{"name":"Bob","age":25,"is_active":false}`
<pre class="brush:php;toolbar:false;">var user User
err := json.Unmarshal([]byte(jsonData), &user)
if err != nil {
    fmt.Printf("反序列化失败: %v\n", err)
    return
}

fmt.Printf("%+v\n", user) // 输出: {Name:Bob Age:25 Email: IsActive:false}

}

注意:
- 第二个参数必须是指向目标变量的指针,否则无法修改原始值。
- JSON 中缺失的字段会被设置为对应类型的零值(如 string 为 "",int 为 0,bool 为 false)。

3. 处理 map 和 slice 的 JSON 转换

除了结构体,也可以直接对 map 或 slice 进行序列化与反序列化。

PictoGraphic PictoGraphic

AI驱动的矢量插图库和插图生成平台

PictoGraphic 133 查看详情 PictoGraphic 示例:map 转 JSON

data, _ := json.Marshal(map[string]interface{}{
    "id":   1,
    "name": "Test",
    "tags": []string{"go", "json"},
})
fmt.Println(string(data)) // {"id":1,"name":"Test","tags":["go","json"]}

示例:JSON 数组转 slice

jsonStr := `[{"name":"A"},{"name":"B"}]`
var users []map[string]string
json.Unmarshal([]byte(jsonStr), &users)
fmt.Println(users) // [map[name:A] map[name:B]]

4. 常见注意事项与技巧

  • 只有导出字段(首字母大写)才会被 json 包处理。
  • 使用 string tag 可让数字以字符串形式编码,例如:Age int `json:"age,string"`
  • 时间类型通常配合 time.Time 和自定义格式使用,建议统一使用 RFC3339 格式。
  • 反序列化时若 JSON 字段多于结构体字段,多余字段默认被忽略;若想捕获,可用 map[string]interface{}
  • 浮点数解析默认使用 float64,整数为 int64,注意数值范围。

基本上就这些。掌握 json.Marshaljson.Unmarshal 是Golang开发中的基础技能,结合结构体tag能灵活控制输出格式,适用于Web服务、微服务通信等多种场景。

以上就是如何用Golang使用encoding/json.Marshal和Unmarshal_Golang JSON序列化反序列化实践的详细内容,更多请关注其它相关文章!


# 如何用  # 移动网站建设和维护  # 永城抖音营销推广团队有哪些  # 雕牌营销推广方案策划  # 企业seo实战  # 宝安综合网站建设怎么样  # 关于政府网站建设意见  # 淘宝关键词排名一直下降  # 南通seo优化简单吗  # 延津网站优化设计  # 网站响应优化方案设计  # 如何在  # 这是  # 资源管理  # 为空  # 出现在  # js  # 加载  # 数据结构  # 序列化  # json数组  # golang开发  # 字符串解析  # 配置文件  # ai  # 字节  # 编码  # go语言  # golang  # go  # json 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 谷歌推RCS信息存档功能:公司可监控员工私密信息!  AO3最新官网入口公告_2025AO3镜像站实时查询方法  PHP URL参数传递与500错误调试指南  Go Martini框架:动态服务解码后的图片内容  CSS实现侧边栏导航项全宽圆角悬停背景效果  C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用  创客贴用户入口官网登录 创客贴网页版电脑版系统  蛙漫2台版漫画地址 Manwa2正版网页版链接  Go调试环境为何无法启动_Go调试器启动失败原因与解决策略  斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程  C++如何实现线程池_C++11手动实现一个简单的固定大小线程池  解决Django多数据库/多Schema环境下外键迁移问题  CSS子选择器:如何区分并样式化嵌套列表的子层级  在命令行怎么运行html项目_命令行运行html项目方法【教程】  Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口  win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】  win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法  c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架  抖音创作助手登录入口_抖音创作辅助工具官网直达  Mac怎么查看崩溃日志_Mac控制台错误报告分析  Win11怎么用U盘重装系统 Win11制作启动盘并重装系统完整教程【详解】  俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口  sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置  夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案  excel如何生成目录 excel一键生成工作表目录超链接  零跑汽车11月交付量达70327台 实现连续9个月正增长  中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】  纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析  蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台  Yandex搜索引擎一键访问入口_俄罗斯Yandex官网免登录  响应式容器内容自动缩放与宽高比维持教程  Spring Boot嵌入式服务器与J*a EE:功能支持深度解析  正确连接J*aScript到HTML实现可点击图片与自定义事件处理  Win10如何恢复误删的快捷方式_Win10重建常用软件快捷方式  TikTok国际版官网直达_TikTok国际版官网直达进入在线观看  顺丰快递查询系统 官方正版查询入口  抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明  《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元  ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版  Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区  支付宝如何设置安全保护_支付宝安全设置的全面教程  漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  解决深度学习模型训练初期异常高损失与完美验证准确率问题  css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染  J*aScript中在Map循环中检测并处理空数组元素  抖音极速版最新版本 抖音极速版官方下载地址  J*aScript DOM操作:高效清空列表元素的策略与实践  单射、满射与双射的关系 一文理清所有逻辑  在J*aScript中复现SciPy的B样条拟合与求值:关键考量 

搜索