简介
Json(Javascript Object Nanotation)是一种数据交换格式,常用于前后端数据传输。任意一端将数据转换成json 字符串,另一端再将该
字符串解析成相应的数据结构,如string类型,strcut对象等。
go语言本身为我们提供了json的工具包<font style="background-color:#FADB14;">encoding/json</font>
## Json Marshal
> 将数据编码成json字符串
>
go
func Marshal(v interface{}) ([]byte, error)
:::warning
注意,返回的是byte数组
:::
看一个简单的例子
结果:
type Stu struct {Name string `json:"name"`Age intHIgh boolsex stringClass *Class `json:"class"`}type Class struct {Name stringGrade int}func main() {//实例化一个数据结构,用于生成json字符串stu := Stu{Name: "张三",Age: 18,HIgh: true,sex: "男",}//指针变量cla := new(Class)cla.Name = "1班"cla.Grade = 3stu.Class=cla//Marshal失败时err!=niljsonStu, err := json.Marshal(stu)if err != nil {fmt.Println("生成json字符串错误")}//jsonStu是[]byte类型,转化成string类型便于查看fmt.Println(string(jsonStu))}
{"name": "张三","Age": 18,"HIgh": true,"class": {"Name": "1班","Grade": 3}}
从结果中可以看出:
- 只要是可导出成员(变量首字母大写),都可以转成json。因成员变量sex是不可导出的,故无法转成json。
- 如果变量打上了json标签,如Name旁边的 json:”name” ,那么转化成的json key就用该标签“name”,否则取变量名作为key,如“Age”,“HIgh”。
- bool类型也是可以直接转换为json的value值。Channel, complex 以及函数不能被编码json字符串。
- 指针变量,编码时自动转换为它所指向的值,如cla变量。
(当然,不传指针,Stu struct的成员Class如果换成Class struct类型,效果也是一模一样的。只不过指针更快,且能节省内存空间。)
Json Unmarshal
将json字符串解码到相应的数据结构
:::warning (The argument to Unmarshal must be a non-nil pointer.)
:::
func Unmarshal(data []byte, v interface{}) error
看一个简单的例子
type StuRead struct {Name interface{} `json:"name"`Age interface{}HIgh interface{}sex interface{}Class interface{} `json:"class"`Test interface{}}type Class struct {Name stringGrade int}func main() {//json字符中的"引号,需用\进行转义,否则编译出错//json字符串沿用上面的结果,但对key进行了大小的修改,并添加了sex数据data:="{\"name\":\"张三\",\"Age\":18,\"high\":true,\"sex\":\"男\",\"CLASS\":{\"naME\":\"1班\",\"GradE\":3}}"str:=[]byte(data)//1.Unmarshal的第一个参数是json字符串对应的byte数组,第二个参数是接受json解析的数据结构。//第二个参数必须是指针,否则无法接收解析的数据,如stu仍为空对象StuRead{}//2.可以直接stu:=new(StuRead),此时的stu自身就是指针stu:=StuRead{}err:=json.Unmarshal(str,&stu)//解析失败会报错,如json字符串格式不对,缺"号,缺}等。if err!=nil{fmt.Println(err)}fmt.Println(stu)}
结果
{张三 18 true <nil> map[naME:1班 GradE:3] <nil>}
