![01fc4c8ad4146140ba4780f0fb8dc792.png](https://i-blog.csdnimg.cn/blog_migrate/953612bdb69ee665cdbd11c4afec0ff7.jpeg)
笔者之前有写过关于 xml 的使用文章,今天来给大家介绍关于数据序列化和反序列化的一种常见方式 JSON. 尤其是在 http,rpc 的微服务调用中。
基础语法
在 Go 中我们主要使用官方的 encoding/json 包对 json 数据进行序列化和反序列化,主要使用方法有:
- 序列化:
![cb4f210d71d98e76e4806852c6babf62.png](https://i-blog.csdnimg.cn/blog_migrate/b38d9e186b5a1848e205b8fecd6bf55c.jpeg)
- 反序列化:
![653c7d355b2d059203ed8ed2e91c6dca.png](https://i-blog.csdnimg.cn/blog_migrate/f8ef72aeab61cb078d9d7073a2b441c0.jpeg)
简单的例子
![be95e7f4d2e46be9850753e2b7d15fb4.png](https://i-blog.csdnimg.cn/blog_migrate/dced14c24419f5e13b445d7b265db8c0.jpeg)
当我们运行代码的时候可以得到如下输出结果:
![58015c26505f1b1ba0ae199eb125a37d.png](https://i-blog.csdnimg.cn/blog_migrate/f7245de4028a797db907829208e485c3.jpeg)
在这个列子中,我们使用 unmarshal 和 marshal 将一个整数的 JSON 二进制转化为 go int 数据
注意:在实际应用中,我们在序列化和反序列化的时候,需要检查函数返回的 err,如果 err 不为空,表示数据转化失败。
例如:我们把上面例子中 value 类型由 int 修改为 string 后再次运行代码,你将得到 unmarshal error is:json:cannot unmarshal number into Go value of type string的错误提醒。
数据对应关系
JSON 和 Go 数据类型对照表
![b71997c828d1bfa023052faf07b197fb.png](https://i-blog.csdnimg.cn/blog_migrate/60392396cbc56996641c4c3b8f821620.jpeg)
例如:
![12da19d1c5fc5ccaf8f88dbff059b668.png](https://i-blog.csdnimg.cn/blog_migrate/d9fa869c3f67c11f8b3bc980c8a88094.jpeg)
运行代码我们可以得到如下输出结果
![3bb6a7b77cd64e35129a328255a17492.png](https://i-blog.csdnimg.cn/blog_migrate/6438371b036ca7bb83cc8e51aa855fe6.jpeg)
自定义数据类型
除了使用上面基础数据外,对于那些比较复杂的数据集合(Object),我们还可以使用自定义数据类型 struct 来转化。
Go 中关于 JSON 转化字段名的对应语法为:
![d30a69f310e6d47001ebfd040b18d6be.png](https://i-blog.csdnimg.cn/blog_migrate/e6a6ae3c17ece43dcd6efd0b6d2db718.jpeg)
如果我们想忽略那些空值的字段,我们可以使用 omitempty 选项:
![9bb4017312d9918f95b1ec7666f7a158.png](https://i-blog.csdnimg.cn/blog_migrate/9773dbd98b689cf65fc70c325355d23a.jpeg)
如果我们想忽略特定字段:
![87bc84c3a99156ffd1906882fdc3a346.png](https://i-blog.csdnimg.cn/blog_migrate/da461728db2930bf085e5b3f9913d7e2.jpeg)
组合示例
![9706a503974cceba76fd7e8dd1865075.png](https://i-blog.csdnimg.cn/blog_migrate/621e54c219e6db401d9c22cce87e03d1.jpeg)
实战练习
假如我们有这一样一段 JSON 数据,它表示一个学生的考试成绩,下面我们就来看看在 Go 中如何序列化和反序列化。
数据准备
![178ba244c68d17a546f644a2ae1c9c13.png](https://i-blog.csdnimg.cn/blog_migrate/9d7834c0151d5cc1600290c8289bebfb.jpeg)
反序列化
![4d458a4597763c003002eeb0d3720836.png](https://i-blog.csdnimg.cn/blog_migrate/c4f1ad7b06ef0eb0436473afcaf97eac.jpeg)
运行代码输出结果为:
![8c8bd008a9644d7a3dbc78b140e79849.png](https://i-blog.csdnimg.cn/blog_migrate/64c7ad3f348e309e74b614fcd12aa399.jpeg)
序列化
![81ecb34ef028f2e0fdfabaec6177451c.png](https://i-blog.csdnimg.cn/blog_migrate/fdb5bf27a0d9bc63399e02cd09fa5e4a.jpeg)
当我们运行代码后,打开 data2.json 文件。将看到如下内容:
![80433f34807197b5a48a8bf61f52d0ac.png](https://i-blog.csdnimg.cn/blog_migrate/c0c5416a0a572be8e7aa0dd9f16fd9e1.jpeg)
Python 运维开发——18天训练营
本课程为:网络班+面授班(北京)
第一:¥1299 仅剩2天
第二:开课时间 5月12日
第三:为期18天(每周一天)
主讲师:
Panda :曾就职于豆瓣,某互联网医疗企业运维负责人
Monkey :曾就职爱奇艺,某在线教育独角兽企业运维研发负责人
训练大纲
Day1-Day4 Python 基础
● 基础语法 + 数据类型+文件处理
Day5-Day6 Python 进阶
● 函数式编程 + 面向对象 + 多线程
Day7-Day10 Django Web 开发入门
● Django MTV + Django Admin + Bootstrap/jQuery
Day11-Day18 项目实战
● 用户权限管理系统+ 多云管理 CMDB 系统 + 运维工单系统 + 代码发布系统
报名方式
添加小助手WeChat:17812796384,回复【18天训练营】
![232b699eb3f3ec8531a25d28af9e029a.png](https://i-blog.csdnimg.cn/blog_migrate/dd81f5d10df6ad0992f07c4b0ed61449.jpeg)
Golang 课程5月开课,想要学习的小伙伴抓紧时间,早报名享受早鸟价