json格式可以算我们日常最常用的序列化格式之一了,Go语言作为一个由Google开发,号称互联网的C语言的语言,自然也对JSON格式支持很好。官方提供的Json解析包已经非常强大,我们接下来讲解Json的序列化与反序列化操作。另外还有一些第三方的Json解析库,也能够高效的操作Json对象,比如simplejson,ffjson等。下面是两个比较重要的函数:
• Json Marshal:将数据编码成json字符串
Marshal 用于将struct对象序列化到json对象中。v是interface{}类型,任何类型都实现了空接口。
1:tag中的第一个参数是用来指定别名,比如Name 指定别名为 username `json:"username"`
2:如果不想指定别名但是想指定其他参数用逗号来分隔,omitempty 指定到一个field时,如果在赋值时对该属性未赋值或者对该属性赋值为 zero value,那么将Person序列化成json时会忽略该字段
3:- 指定到一个field时,无论有没有值,将Person序列化成json时都会忽略该字段
4:string 指定到一个field时,比如Person中的Count为int类型 如果没有任何指定在序列化到json之后也是int 比如这个样子 “Count”:0,但是如果指定了string之后序列化之后也是string类型的,那么就是这个样子"Count":"0"
• struct序列化为Json
• slice序列化为Json
• map 序列化为Json
• Json Unmarshal:将json字符串解码到相应的数据结构,Unmarshal的第一个参数是[]byte,第二个参数是接受json解析的数据结构。
下面我们依次讲解Json的操作。
1:将Json序列化进入结构体
2::将Json序列化到结构体slice
3:将Json序列化进Map
4:将Json序列化进Slice
Go解析json遇到了大数字、不定格式等特殊情况,在此做了一个整理。
选择哪个要视输入而定。
json.Unmarshal 操作对象是一个 []byte ,也就意味着被处理的JSON要全部加载到内存。如果有一个加载完的JSON使用 json.Unmarshal 会快一些。
json.Decoder 操作的是一个 stream ,或者其他实现了 io.Reader 接口的类型。意味着可以在接收或传输的同时对其进行解析。当处理一组较大数据时无需重新copy整个JSON到内存中。
最好的选择办法如下:
默认情况下,go对json解析过程中遇到的数字都会当做float64处理。如果数字过大会有精度丢失。可以使用json.Number来处理。
输出结果:
使用 json.Decoder 只能操作 io.Reader 类型的JSON数据。
有时候遇到字段不定的JSON,需要一边判断一边解析。如:
可以先统一解组到interface{} 然后判断关键字段再进行后续处理。
结果
使用RawMessage便于分步Unmarshal
原文链接
golang对json序列化和反序列化的操作实在是难受,所以说用习惯了高级语言特性,再转到这些偏原生的写法上就会很难受。
不多BB,开始记录。
当写个小demo或者做个小工具,没有大规模使用场景,那使用哪个库都是一样的,因为性能的体现并不会很明显。但是如果是在实际项目中使用,且伴随着高并发,大容量等场景,我还是推荐使用 json-iterator 。
号称最快的go json解析器。跟官方的写法兼容,我目前基本都使用这个。
https://github.com/json-iterator/go
效率对比
ns 纳秒 op 操作
俩种方式,一种直接反序列化成 结构体数组,另一种反序列化为 slice,内容为map[string]interface{}
结构体数组
slice
http://www.zhouhuibo.club