json编码和解码
在go语言中内置了对于json数据的编码和解码工具。关于json格式数据的操作都在json包中。
解码
假设我们有下面这样的一份json数据:
{ "success" :true, "total": 1214, "rows":[{ "id":1, "name":"zhongzhong", "age": 25 },{ "id":2, "name":"wangerxiao", "age":15 }]}复制代码
package mainimport ( "fmt" "encoding/json" "net/http" "log")type user struct{ Id int `json:"id"` Name string `json:"name"` Age int `json:"age"`}type userRes struct{ Success bool `json:"success"` Total int `json:"total"` Users []user `json:"rows"`}func main(){ res ,err := http.Get("http://127.0.0.1:8080/data.json") if err != nil{ log.Println("请求数据出错。。",err) return } //这里表示延迟到改函数最后执行 defer res.Body.Close() var ur userRes err = json.NewDecoder(res.Body).Decode(&ur) if err != nil{ log.Println("解析返回结果出错。。") return } fmt.Println(ur)}//{true 1214 [{1 zhongzhong 25} {2 wangerxiao 15}]}复制代码
上面的代码中,定义了两个自定义类型,一个user类型,一个userRes类型。其中,在每一个属性后面都添加了一个反引号的字符串。这个字符串在go语言中表示标签。在与json数据匹配的时候,就是根据这些标签里面指定的来匹配数据的。如果不指定这些标签,那么go语言会根据属性的名称来配置,在匹配过程中属性名称不区分大小写。
所以,上面的user类型的标签都可以省略,而userRes类型中,除了Users属性之外,其他的都可以省略。
编码
还是以上面的数据为目标,我们来编码出这样的json格式数据。
package mainimport ( "log" "fmt" "encoding/json")type user struct{ Id int `json:"id"` Name string `json:"name"` Age int `json:"age"`}type userRes struct{ Success bool `json:"success"` Total int `json:"total"` Users []user `json:"rows"`}func main(){ //构造数据 ur := userRes{ Success: true , Total: 1214 , Users: []user{ { 1,"zhongzhong",25}},//这里使用字面量初始化一条记录 } //使用append函数追加一条记录 ur.Users = append(ur.Users,user{ 2,"wangerxiao",15}) //使用MarshalIndent来将ur对象转换为json字符串 //这个函数返回一个byte类型的切片,和一个error值 data, err := json.MarshalIndent(ur,""," ") if err != nil{ log.Println("编码错误",err) return } //这里需要将byte类型的切片转换为string类型 fmt.Println(string(data))}////{ // "success": true,// "total": 1214,// "rows": [// { // "id": 1,// "name": "zhongzhong",// "age": 25// },// { // "id": 2,// "name": "wangerxiao",// "age": 15// }// ]//}复制代码
那么如果我想将对象转换为json字符串之后,输出到文件中该怎么做呢?看下面的代码:
package mainimport ( "os" "log" "encoding/json")type user struct{ Id int `json:"id"` Name string `json:"name"` Age int `json:"age"`}type userRes struct{ Success bool `json:"success"` Total int `json:"total"` Users []user `json:"rows"`}func main(){ ur := userRes{ Success: true , Total: 1214 , Users: []user{ { 1,"zhongzhong",25}}, } ur.Users = append(ur.Users,user{ 2,"wangerxiao",15}) file , err := os.OpenFile("data.json",os.O_CREATE | os.O_WRONLY | os.O_APPEND,0666) if err != nil{ log.Println("打开文件失败",err) return } json.NewEncoder(file).Encode(ur)}复制代码
上面的代码执行之后,就会将ur转换为字符串,并且写入到文件data.json中。