新闻中心

Golang如何处理JSON数据序列化与反序列化

2025-10-28
浏览次数:
返回列表
Go语言通过encoding/json包实现JSON序列化与反序列化,使用结构体标签如json:"name"映射字段,omitempty忽略零值,字段需首字母大写以导出;通过json.Marshal将结构体转为JSON字符串,json.MarshalIndent可格式化输出;反序列化时用json.Unmarshal将JSON数据解析到结构体指针,避免修改失败;对于未知结构可用map[string]interface{}接收并结合类型断言处理。

golang如何处理json数据序列化与反序列化

Go语言通过标准库encoding/json提供了对JSON数据的序列化(结构体转JSON)和反序列化(JSON转结构体)支持。使用起来简单高效,适合处理API交互、配置读取等场景。

定义结构体并使用标签控制字段映射

Go中通常用结构体表示JSON对象。通过json:标签指定每个字段在JSON中的名称,还能控制是否忽略空值等行为。

例如:

type User struct {
    ID    int    <font color="#0000FF">`json:"id"`</font>
    Name  string <font color="#0000FF">`json:"name"`</font>
    Email string <font color="#0000FF">`json:"email,omitempty"`</font>
    Age   uint8  <font color="#0000FF">`json:"age,omitempty"`</font>
}

说明:

  • json:"name" 表示该字段在JSON中显示为name
  • omitempty 表示当字段为零值时,序列化会自动省略
  • 字段必须是可导出的(首字母大写),否则json包无法访问

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

使用json.Marshal()将Go值转换为JSON字节流。

user := User{ID: 1, Name: "Alice", Email: "alice@example.com"}
data, err := json.Marshal(user)
if err != nil {
    log.Fatal(err)
}
fmt.Println(string(data)) // {"id":1,"name":"Alice","email":"alice@example.com"}

若想输出格式化JSON(带缩进),可用json.MarshalIndent()

Android创建和使用数据库详细指南 中文WORD版 Android创建和使用数据库详细指南 中文WORD版

每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库--SQLite,本文介绍的就是如何为你的Android应用程序创建和操作SQLite数据库。 数据库支持每个应用程序无论大小的生命线,除非你的应用程序只处理简单的数据,那么就需要一个数据库系统存储你的结构化数据,Android使用SQLite数据库,它是一个开源的、支持多操作系统的SQL数据库,在许多领域广泛使用,如Mozilla FireFox就是使用SQLite来存储配置数据的,iPhon

Android创建和使用数据库详细指南 中文WORD版 0 查看详情 Android创建和使用数据库详细指南 中文WORD版
data, _ := json.MarshalIndent(user, "", "  ")
fmt.Println(string(data))

反序列化:JSON字符串解析到结构体

使用json.Unmarshal()将JSON数据填充到结构体变量中。

jsonStr := `{"id":2,"name":"Bob","age":25}`
var user2 User
err := json.Unmarshal([]byte(jsonStr), &user2)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("%+v\n", user2) // {ID:2 Name:Bob Email: Age:25}

注意传入的是结构体指针,否则无法修改原始变量。

处理动态或未知结构的JSON

如果不知道JSON的具体结构,可以用map[string]interface{}interface{}接收。

var data map[string]interface{}
json.Unmarshal([]byte(jsonStr), &data)
fmt.Println(data["name"]) // Bob
</font>

遍历嵌套内容时需做类型断言:

if name, ok := data["name"].(string); ok {
    fmt.Println("Name:", name)
}

基本上就这些。掌握MarshalUnmarshal配合结构体标签,就能应对大多数JSON处理需求。不复杂但容易忽略字段导出和指针传递的问题。

以上就是Golang如何处理JSON数据序列化与反序列化的详细内容,更多请关注其它相关文章!


# 如何处理  # 中国海员建设工会网站  # 庆阳做网站推广  # 长安区网站优化排名  # 茂名网站建设美丽文案  # 如何推广套图网站视频呢  # 建设网站所有细节  # 浙江网站建设价格便宜  # 临汾seo优化询问报价  # 长春seo服务哪个便宜  # 哈尔滨建设网站成本多少  # 操作系统  # 首字母  # 的是  # 资源管理  # 开源  # js  # 化与  # 应用程序  # 加载  # 序列化  # 标准库  # 字符串解析  # 格式化输出  # json处理  # ai  # 字节  # go语言  # golang  # go  # json 


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


相关推荐: 苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】  谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航  LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  Golang如何实现状态模式管理对象状态_Golang State模式实现技巧  在Runstone环境中高效处理TasteDive API的JSON数据  AO3官方镜像站点汇总 AO3同人作品网页版直达链接  C#使用XPath查询节点时出错? 常见语法错误与调试技巧  在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南  小红书网页版入口链接分享 小红书官网直接进  Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧  印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】  动漫花园资源网使用步骤_动漫花园资源网下载流程  R星幕后开发视频泄露 包含《GTA6》等多款大作  整合Supabase认证与Django模型:跨模式迁移的解决方案  qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决  如何在Promise链中优雅地中断后续then执行  Golang如何优雅处理error_Golang error处理最佳实践总结  在哪找SublimeJ远程工具_SFTP插件配置教程  如何在CSS中使用visited与link控制链接颜色_visited link伪类配合  Golang如何使用new_Go new分配内存机制讲解  离线运行Go语言之旅:本地部署与GOPATH配置指南  Archive of Our Own官网直达 AO3最新可用地址一览  sublime怎么预览Markdown渲染效果_Markdown Preview插件 for sublime教程  Win11文件资源管理器卡顿怎么修 Win11重置资源管理器进程优化响应速度【修复方法】  在Typer应用中优雅地处理和重组任意命令行参数  不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|  mc.js官网登录入口 mc.js官方登录入口最新版  绝地鸭卫平a核爆刀流玩法攻略  电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】  内存检查:在VS Code中调试C++时的内存视图  PrimeNG Sidebar背景色自定义指南:CSS覆盖与主题化实践  解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException  优化Django表单:提交验证失败后保留用户输入  荣耀Play7T运行卡顿解决_荣耀Play7T性能优化  腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法  批改网学生版PC登录 批改网官网登录系统入口  微信群消息显示延迟如何解决 微信群消息刷新优化方法  SteamMachine定价或为699美元 大家想入手吗?  uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页  word中如何让数字纵向排列_Word数字纵向排列方法  在Go Martini框架中高效服务动态生成图像的实践指南  J*a TimerTask文件监控:HashMap状态管理与常见陷阱规避指南  windows10怎么查看本机ip_windows10命令提示符ipconfig使用  在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略  现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践  如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法  解决 Express.js 中 PUT 请求密码修改失败的路由配置指南  优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率  J*aScript数据结构转换:将对象数组按类别分组 

搜索