博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Go学习笔记9】go语言中的工具包-json
阅读量:5942 次
发布时间:2019-06-19

本文共 2657 字,大约阅读时间需要 8 分钟。

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中。

转载于:https://juejin.im/post/5a2b4da36fb9a0451c3a5165

你可能感兴趣的文章
SpringMVC4 返回Json数据
查看>>
我的友情链接
查看>>
sharepoint 2007 网站操作 显示菜单不全
查看>>
如何使用charles对Android Https进行抓包
查看>>
XenServer中License的设置对各种操作的影响
查看>>
mesos-dns & marathon-lb
查看>>
工作随笔之nginx 应用场景
查看>>
排序算法之选择排序
查看>>
typedef函数指针用法
查看>>
iOS开发之观察者模式初探
查看>>
官方文档
查看>>
multiple Rational objects
查看>>
学习,从这一刻开始
查看>>
55:Mysql用户管理|常用sql语句|mysql数据库备份恢复
查看>>
java WebSocket实现一对一消息和广播消息Demo
查看>>
Confluence 6 数据库结构图
查看>>
我的友情链接
查看>>
Docker命令查询
查看>>
Impala使用笔记(一)
查看>>
Epoll
查看>>