json编码和解码
在go语言中内置了对于json数据的编码和解码工具。关于json格式数据的操作都在json包中。
解码
假设我们有下面这样的一份json数据:
{
"success" :true,
"total": 1214,
"rows":[{
"id":1,
"name":"zhongzhong",
"age": 25
},{
"id":2,
"name":"wangerxiao",
"age":15
}]
}
复制代码
package main
import (
"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 main
import (
"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 main
import (
"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中。