JSON学习
什么是JSON?
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成,采用完全独立于程序语言的文本格式,使得它成为较为理想的跨语言跨平台的数据交换语言。开发者可以使用json传输简单的字符串,数字,布尔值,也可以传输一个数组或者更为复杂的复合结构。在Web开发领域中,JSON被广泛应用于服务端与客户端之间的数据通信,也常常用于程序网络通信中的远程过程调用(RPC)。
JSON的格式
go语言内置对于json的支持,在内置的encoding/json标准库中开发者可以使用Go程序生成和解析json格式的数据。
编码为JSON格式
使用json.Marshal()函数可以对一组数据进行JSON格式的编码。函数声明如下:
func Marshal(v interface{})([]byte,err)
json编码有两种数据结构
- 对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,…}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为对象.key 获取属性值,这个属性值的类型可以是数字、字符串、数组、对象几种。
- 数组:数组在js中是中括号“[]”括起来的内容,数据结构为 [“java”,”javascript”,”vb”,…],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。
假设有如下一个Book类型的结构体:
type Book struct{
Title string
Authors []string
Publisher string
Ispublished bool
Price float64
}
并且有如下一个Book类型的实例对象:
goBook:=Book{
"Go编程",
{“刘更新”,“刘某”,“刘优秀”},
“baidu.com”,
true,
1000
}
然后我们可以使用json.Marshal()函数将gobook实例生成一段json格式的文本:
b,err:=json.Marshal(goBook)
如果成功,则err被赋值为nil,变量b将会是一个进行JSON格式化后的数组类型,如下所示:
b == []byte('{
"Title": "Go编程",
“Authors": [“刘更新”,“刘某”,“刘优秀”],
“Publisher": “baidu.com”,
”Ispublished": true,
"Price": 1000,
}')
当我们调用json.Marshel()语句时,会递归遍历gobook对象,如果发现这个数据结构实现了json.Marsheler接口且包含有效的值,Marshel就会调用其MarshalJSON()的方法将该对象生成json格式的文本。
- 注意:如果转化前的数据结构中出现指针,那么将会转化指针所指向的值,如果指向的是零值,那么null将会作为转化后的结果。
在Go语言中,JSON转化前后的数据类型映射如下:
- 布尔类型转化为JSON后还是布尔类型。
- 浮点数和整型会被转化为JSON里边的常规数字。
- 字符串将以UTF-8编码转化输出为Unicode字符集的字符串
- 数组和切片会转化为JSON里的数组,但[]byte类型的值将会转化为Base64编码后的字符串,slicele类型的零值将会转化为null
- 结构体会被转化为JSON对象,并且只有结构体里面的以大写字母开头的可悲导出的字段才会被转化输出,而这些可导出的字段会作为JSON对象的字符串索引。
- 转化一个map类型的数据结构时,该数据的类型必须是map[string]T.
解码JSON数据
可以使用json.Unmarshel()函数将JSON格式的文本解码为Go里面预期的数据结构。原型如下:
func Unmarshel(data []byte,v interface{})error
第一个参数为输入,即JSON格式的文本,第二个参数为目标的输出容器,用于存放解码后的值。
- 如果一个有效的JSON数据能够和容器类型的实例对象结构对应,那么JSON解码后的值会一一存放进去。
- 如果结构对不上,函数在解码过程中会丢弃该字段。这个特性可以让我们从同一段JSON中筛选指定的值到多个go语言类型中。
- 如果解码一个未知结构的JSON,只需要将这段JSON解码到一个空的接口即可。要访问解码后的数据,需要先判断目标结构是否为预期的数据类型。