【Go学习笔记9】go语言中的工具包-json

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

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

你可能感兴趣的:(【Go学习笔记9】go语言中的工具包-json)