go中的json处理
JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基础,具有自我描述性且易于让人阅读。JSON由于比XML更小、更快,更易解析,以及浏览器的内建快速解析支持,使得其更适用于网络数据传输领域。
1、JSON解析
json解析也叫json反序列化,相关函数为Unmarshal()
,关于这个函数我们可以通过查看相关代码得到他的实现方法。
func Unmarshal(data []byte, v interface{}) error
通过进一步查看我们就可以得到json反序列化时候采用的方法了。相关内容在decode.go
文件中,大致流程就是
-
查找tag含有相关字符的可导出的struct字段(首字母大写)
-
查找字段名是相关字符的导出字段
-
查找除了首字母之外其他大小写不敏感的导出字段
JSON的解析包括常见以下两种:
- 解析到结构体(知道数据格式)
- 解析到interface(不知道数据格式)
2、JSON生成
json的生成也叫json序列化,相关函数为Marshal
通过查看相关代码我也能看到他的实现方法和Unmarshal
逻辑类似:
func Marshal(v interface{}) ([]byte, error)
相关函数实现都在encode
函数中。 在json序列化的时候需要注意以下几点:
-
字段的tag是
"-"
,那么这个字段不会输出到JSON -
tag中带有自定义名称,那么这个自定义名称会出现在JSON的字段名中。
-
tag中如果带有
"omitempty"
选项,那么如果该字段值为空,就不会输出到JSON串中 -
如果字段类型是bool, string, int, int64等,而tag中带有
",string"
选项,那么这个字段在输出到JSON的时候会把该字段对应的值转换成JSON字符串 -
JSON对象只支持string作为key,所以要编码一个map,那么必须是map[string]T这种类型(T是Go语言中任意的类型)
-
Channel, complex和function是不能被编码成JSON的
-
嵌套的数据是不能编码的,不然会让JSON编码进入死循环
-
指针在编码的时候会输出指针指向的内容,而空指针会输出null
3、代码实例
package main
import (
"encoding/json"
"fmt"
)
type Server struct {
ServerAddr string
ServerName string
ServerIP string
}
type Serverslice struct {
Servers []Server
}
func main() {
var s Serverslice
str := `{"servers":[{"ServerAddr":"Shannxi", "serverName":"Shannxi_v","serverIP":"192.168.1.1"},{"ServerAddr": "Guangdong", "serverName":"Guangdong_V","serverIP":"192.168.1.2"},{"ServerAddr": "Beijing", "serverName":"Beijing_V","serverIP":"192.168.1.3"}]}`
//json解析 反序列化
json.Unmarshal([]byte(str), &s)
fmt.Println(s)
//json生成 序列化
n, _ := json.Marshal(s)
fmt.Println(string(n))
}
运行结果,第一行为反序列化的结果,第二行为序列化的结果。