前言
JSON 是目前最为流行的序列化手段,Go语言对于这些标准格式的编码和解码都有良好的支持,在Go语言中,encoding/json标准包处理json数据的序列化与反序列化问题。下面主要讲解序列化。
什么是序列化
序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。通过从存储区中读取对象的状态,重新创建该对象,则为反序列化。
各种类型的值
JSON是对JavaScript中各种类型的值——字符串、数字、布尔值和对象——Unicode本文编码。它可以用有效可读的方式表示基础数据类型和数组、slice、结构体和map等聚合数据类型。对于json的数据类型,go也会有对象的结构所匹配。大致对应关系如下:

在解析 json 格式数据时,若以 interface{} 接收数据,需要按照以上规则进行解析。
序列化 Marshal()
序列化源码放在:

json.Marshal()
从上面的Marshal()函数我们可以看到,数据结构序列化后返回的是字节数组,而字节数组很容易通过网络传输或写入文件存储。而且在Go中,Marshal()默认是设置escapeHTML = true的,会自动把 ‘<’, ‘>’, 以及 ‘&’ 等转化为" " , "\u003e"以及 “\u0026”。
结构体序列化
golang提供了encoding/json的标准库用于编码json。大致需要两步:
- 首先定义json结构体。
- 使用 Marshal方法序列化。
说了这么多,现在就来写一个结构体序列化程序:
输出结果:

如果想验证JSON格式对不对,可以把输出结果放到JSON验证是否正确。

注意:定义结构体的时候,只有字段名是大写的,才会被编码到json当中。
切片序列化
slice切片,map图则是复合结构。这些结构编码也类似。不过map的key必须是字串,而value必须是同一类型的数据。下面来看看切片序列化程序:
输出结果:

json格式:
map序列化
输出结果:

json格式
总结
上面所介绍的大致覆盖了golang的json编码处理序列化。总体原则分两步,首先定义需要编码的结构,然后调用encoding/json标准库的Marshal方法生成json byte数组,需要转换成string类型即可。还有基本数据类型 序列化,没有什么意义。
欢迎关注微信公众号“程序猿编码” ,这里Linux c/c++ 、Python、Go语言、数据结构与算法、网络编程相关知识,常用的程序员工具。每日00:10之前更新新闻简报,一份简报,纵览天下事!