golang json 编码解码
本文内容纲要:
golang"encoding/json"包实现了json对象的编解码
一、编码
funcMarshal(vinterface{})([]byte,error)
Marshal函数使用下面的基于类型的默认编码格式:
布尔类型编码为json布尔类型。
浮点数、整数和Number类型的值编码为json数字类型。
字符串编码为json字符串。角括号"<"和">"会转义为"\u003c"和"\u003e"以避免某些浏览器吧json输出错误理解为HTML。基于同样的原因,"&"转义为"\u0026"。
数组和切片类型的值编码为json数组,但[]byte编码为base64编码字符串,nil切片编码为null。
结构体的值编码为json对象。每一个导出字段变成该对象的一个成员
Example:
1packagemain
2
3import(
4"fmt"
5"encoding/json"
6)
7funcmain(){
8typeUserstruct{
9Namestring
10Ageint
11}
12user:=User{
13Name:"tom",
14Age:3,
15}
16b,err:=json.Marshal(user)
17iferr!=nil{
18fmt.Println("jsonMarshalfail:",err)
19}
20fmt.Println(string(b))
21}
Output:
{"Name":"tom","Age":3}
1不可导出字段,不会被编码
Example:
typeUserstruct{
Namestring
ageint
}
user:=User{
Name:"tom",
age:3,
}
b,_:=json.Marshal(user)
fmt.Println(string(b))
Output:
{"Name":"tom"}
2可通过结构体标签,改变编码的json对象
Example:
typeUserstruct{
Namestring`json:"name"`
Ageint`json:"ageeeeeeeeeeeeeeeeee"`
}
user:=User{
Name:"tom",
Age:3,
}
b,_:=json.Marshal(user)
fmt.Println(string(b))
Output:
{"name":"tom","ageeeeeeeeeeeeeeeeee":3}
3复杂结构体编码:
指针编码为它指向的值
切片编码为数组
结构体的值编码为json对象
Example:
//复杂结构体编码
//基本类型指针,结构体指针,切片,切片指针,
typeContactstruct{
Addrstring
Phonestring
}
typeUserstruct{
Namestring
Age*int
C1*Contact
C2[]Contact
C3[]*Contact
}
age:=20
c1:=Contact{"北京","12345"}
cArr:=[...]Contact{Contact{"北京","11111"},Contact{"深圳","22222"},Contact{"上海","33333"}}
c2:=cArr[:2]
c3:=make([]*Contact,0)
c3=append(c3,&cArr[0])
c3=append(c3,&cArr[1])
user:=User{
Name:"Tom",
Age:&age,
C1:&c1,
C2:c2,
C3:c3,
}
fmt.Printf("struct:%v\n",user)
b,_:=json.Marshal(user)
fmt.Println("json:",string(b))
Output:
struct:{Tom0xc04204a1c80xc042044580[{北京11111}{深圳22222}][0xc0420860000xc042086020]}
json: {"Name":"Tom","Age":20,"C1":{"Addr":"北京","Phone":"12345"},"C2":[{"Addr":"北京","Phone":"11111"},{"Addr":"深圳","Phone":"22222"}],"C3":[{"Addr":"北京","Phone":"11111"},{"Addr":"深圳","Phone":"22222"}]}
二、解码
funcUnmarshal(data[]byte,vinterface{})error
Example
//json解码测试
typeContactstruct{
Addrstring
Phonestring
}
typeUserstruct{
Namestring
Age*int
C1*Contact
C2[]Contact
C3[]*Contact
}
user:=User{}
j:=`{
"Name":"Tom",
"Age":20,
"C1":{
"Addr":"北京",
"Phone":"12345"
},
"C2":[{
"Addr":"北京",
"Phone":"11111"
},{
"Addr":"深圳",
"Phone":"22222"
}],
"C3":[{
"Addr":"北京",
"Phone":"11111"
},{
"Addr":"深圳",
"Phone":"22222"
}]
}`
err:=json.Unmarshal([]byte(j),&user)
iferr!=nil{
fmt.Println("jsonUnmarshalfail!")
}
fmt.Printf("%v\n",user)
fmt.Println(*user.Age)
fmt.Println(*user.C1)
fmt.Println(*user.C3[0])
Output
{Tom0xc04204a3a80xc0420447a0[{北京11111}{深圳22222}][0xc0420448600xc042044880]}
20
{北京12345}
{北京11111}
参考:Go语言标准库文档中文版
本文内容总结:
原文链接:https://www.cnblogs.com/fhb2011/p/8975184.html