新闻中心

Golang如何开发基础的JSON序列化与反序列化_Golang JSON序列化反序列化项目实战

2025-11-11
浏览次数:
返回列表
定义结构体并使用json标签可实现Go语言中JSON的序列化与反序列化,通过json.Marshal将结构体转为JSON字符串(omitempty可省略空字段),json.Unmarshal将JSON数据解析到结构体,支持嵌套结构与切片,字段需导出(首字母大写)才能被正确处理。

golang如何开发基础的json序列化与反序列化_golang json序列化反序列化项目实战

在Go语言开发中,处理JSON数据是常见需求,尤其是在构建Web服务、API接口或微服务通信时。Go标准库encoding/json提供了强大且高效的JSON序列化与反序列化支持,无需引入第三方依赖即可完成大多数场景下的数据转换。

定义结构体以映射JSON数据

要实现JSON的序列化和反序列化,第一步是定义合适的结构体(struct)。结构体字段需使用标签(tag)来指定对应的JSON键名。

例如,描述一个用户信息:

type User struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
    Age  int    `json:"age"`
    Email string `json:"email,omitempty"`
}

说明:

  • json:"id" 表示该字段在JSON中对应"id"键
  • omitempty 表示当字段为空(如零值)时,序列化结果中将省略该字段

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

使用json.Marshal函数可将Go对象转换为JSON字节流。

user := User{
    ID:    1,
    Name:  "Alice",
    Age:   25,
    Email: "",
}

data, err := json.Marshal(user)
if err != nil {
    log.Fatal(err)
}
fmt.Println(string(data)) // 输出:{"id":1,"name":"Alice","age":25}

注意Email字段为空字符串,由于使用了omitempty,它没有出现在输出中。

若希望保留空字段,可直接调用json.Marshal,或确保字段有值。

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

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

jsonData := `{"id":2,"name":"Bob","age":30,"email":"bob@example.com"}`
var user2 User
err := json.Unmarshal([]byte(jsonData), &user2)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("%+v\n", user2) 
// 输出:{ID:2 Name:Bob Age:30 Email:bob@example.com}

只要JSON中的键能与结构体字段匹配(通过json tag),就能成功赋值。

千鹿Pr助手 千鹿Pr助手

智能Pr插件,融入众多AI功能和海量素材

千鹿Pr助手 128 查看详情 千鹿Pr助手

对于未知结构或动态JSON,可以使用map[string]interface{}接收:

var data map[string]interface{}
json.Unmarshal([]byte(jsonData), &data)
fmt.Println(data["name"]) // 输出 Bob

处理嵌套结构与切片

实际项目中JSON常包含数组或嵌套对象。Go结构体可通过嵌套定义支持这类结构。

type Address struct {
    City  string `json:"city"`
    State string `json:"state"`
}

type UserWithAddr struct {
    ID       int      `json:"id"`
    Name     string   `json:"name"`
    Hobbies  []string `json:"hobbies"`
    Address  Address  `json:"address"`
}

序列化和反序列化方式与简单结构一致,encoding/json会自动递归处理嵌套字段。

例如反序列化以下JSON:

{
  "id": 3,
  "name": "Charlie",
  "hobbies": ["reading", "coding"],
  "address": {
    "city": "Beijing",
    "state": "CN"
  }
}

只需调用Unmarshal即可完整映射到结构体。

基本上就这些。掌握结构体标签、Marshal/Unmarshal用法以及嵌套处理,就能应对大多数JSON操作场景。不复杂但容易忽略细节,比如字段必须导出(首字母大写)、正确使用omitempty等。

以上就是Golang如何开发基础的JSON序列化与反序列化_Golang JSON序列化反序列化项目实战的详细内容,更多请关注其它相关文章!


# 为空  # 巴中seo搜索引擎  # 什么网站可以做礼品推广  # 永州关键词排名公司推荐  # 临沂谷歌seo优化  # 南京关键词seo  # 沙嘴办事处网站建设  # 百度seo软件出名乐云seo专家  # 互联网关键词排名技能  # 高端网站建设的现状  # 荣成网站优化企业  # 如何在  # 是在  # 首字母  # 资源管理  # js  # 就能  # 化与  # 加载  # 递归  # 序列化  # 标准库  # 字符串解析  # ai  # 字节  # go语言  # golang  # go  # json 


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


相关推荐: 漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  J*aScript异步迭代器_j*ascript异步遍历  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  qq音乐在线播放入口_qq音乐电脑版登录链接  微信聊天记录怎么加密_微信聊天记录加密方法  修复二维数组索引越界异常:一维循环到二维坐标的正确映射  Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】  如何使 Jest 模拟函数默认抛出错误以提高测试效率  神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  AO3最新镜像入口 Archive of Our Own官方平台访问  Vue.js 图片显示异常排查:理解应用挂载范围与DOM ID唯一性  响应式容器内容自动缩放与宽高比维持教程  在J*aScript中复现SciPy的B样条拟合与求值:关键考量  FullCalendar 自定义按钮样式定制指南  Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】  快速CSGO开箱网站指南 CSGO开箱平台推荐  vivo云服务网页版登录 怎么登录vivo云服务网页版  qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程  Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】  黑猫投诉统一入口官网 消费者权益保护投诉平台  outlook中文官网入口地址 outlook官方中文版直达首页链接  126邮箱账号注册 电脑版登录入口  谷歌推RCS信息存档功能:公司可监控员工私密信息!  夸克浏览器图书入口 夸克手机浏览器阅读入口  搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具  Composer中的^和~符号代表什么_精通Composer版本号语义化约束  文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】  Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖  机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等  为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法  在VS Code中配置和运行Dart程序的完整步骤  三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升  解决Bootstrap卡片顶部边距导致背景图下移的问题  漫蛙漫画官方主页入口 漫蛙MANWA网页直达访问链接  如何优雅地解决Livewire文件上传难题?SpatieLivewireFilepond让一切变得简单  HTML元素状态管理:根据DIV内容动态启用/禁用按钮  Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】  CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题  《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情  Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理  响应式图片在网页设计中的正确实现方法  一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰  顺丰国际快递查询 国际件官方查询入口  cad如何更改注释性对象的比例_cad注释性比例调整方法  React Hooks最佳实践:动态组件状态管理的组件化方案  NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略  C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件  黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】  解决深度学习模型训练初期异常高损失与完美验证准确率问题 

搜索