Go(golang) 操作JSON
本章介绍如何使用Go语言对JSON对象进行编码和解码。让我们从准备环境开始,用Go为JSON编程。
环境
Go语言自带的JSON转换库为 encoding/json,我们直接使用这个类库进行测试。
用Go对JSON进行编码
把对象转换为JSON的方法为 json.Marshal(),语法如下:
func Marshal(v interface{}) ([]byte, error)
这个函数接收任意类型的数据 v,并转换为字节数组类型,返回值就是我们想要的JSON数据和一个错误代码。当转换成功的时候,这个错误代码为nil
在进行对象转换为 JSON 的过程中,会遵循如下几条规则:
布尔型转换为 JSON 后仍是布尔型 , 如true -> true
浮点型和整数型转换后为JSON里面的常规数字,如 1.23 -> 1.23
字符串将以UTF-8编码转化输出为Unicode字符集的字符串,特殊字符比如<将会被转义为\u003c
数组和切片被转换为JSON 里面的数组,[]byte类会被转换为base64编码后的字符串,slice的零值被转换为null
结构体会转化为JSON对象,并且只有结构体里边以大写字母开头的可被导出的字段才会被转化输出,而这些可导出的字段会作为JSON对象的字符串索引
转化一个map 类型的数据结构时,该数据的类型必须是 map[string]T(T 可以是encoding/json 包支持的任意数据类型)
例子
package main import ( "encoding/json" "fmt" ) type Server struct { ServerName string `json:"serverName"` ServerIP string `json:"serverIP"` } type Serverslice struct { Servers []Server `json:"servers"` } func main() { var s Serverslice s.Servers = append(s.Servers, Server{ServerName: "kaifaxueyuan.com", ServerIP: "192.168.0.1"}) s.Servers = append(s.Servers, Server{ServerName: "pcwanjia.com", ServerIP: "192.168.0.2"}) b, err := json.Marshal(s) if err != nil { fmt.Println("json err: ", err) } fmt.Println(string(b)) }
执行上述代码,会输出如下内容:
{"servers":[{"serverName":"kaifaxueyuan.com","serverIP":"192.168.0.1"},{"serverName":"pcwanjia.com","serverIP":"192.168.0.2"}]}
用Go对JSON进行解码
把 JSON 转换回对象的方法为 json.Unmarshal(),语法如下:
func Unmarshal(data [] byte, v interface{}) error
这个函数会把传入的 data 作为一个JSON来进行解析,解析后的数据存储在参数 v 中。这个参数 v 也是任意类型的参数(但一定是一个类型的指针),原因是我们在是以此函数进行JSON 解析的时候,这个函数不知道这个传入参数的具体类型,所以它需要接收所有的类型。
如果JSON中的字段在Go目标类型中不存在,json.Unmarshal() 函数在解码过程中会丢弃该字段。
在Go的标准库encoding/json包中,允许使用map[string]interface{}和[]interface{} 类型的值来分别存放未知结构的
例子
package main import ( "encoding/json" "fmt" ) type Server struct { ServerName string ServerIP string } type Serverslice struct { Servers []Server } func main() { var s Serverslice str := `{"servers":[{"ServerName":"kaifaxueyuan.com","serverIP":"192.168.0.1"}, {"ServerName":"pcwanjia.com","serverIP":"192.168.0.2"}]}` json.Unmarshal([]byte(str), &s) fmt.Println(s.Servers[0].ServerName, s.Servers[0].ServerIP) }
执行上述代码,会输出如下内容
kaifaxueyuan.com 192.168.0.1