Go - JSON
二十七、json
1、json格式
[{"name":"李白", "age":20,"address":["北京","上海"]},{"name":"杜甫", "age":20,"address":["北京","城府"],"hobby":["足球","篮球"]}]
2、json序列化
json序列化 是指,将有 key-value 结构的数据类型(比如结构体、map、切片)序列化成json字符串的操作。
json.Marshal(a) //a是结构体\map\切片,即要转换成json的变量
通过 json 的 tag 标签,指定将数据转化成json格式后,其key值
3、反序列化
json反序列化 是指,将json字符串反序列化成对应的数据类型(比如结构体、map、切片)的操作
4、实例
serialfunc.go
package main
import (
"encoding/json"
"fmt"
)
type Monster struct {
Name string `json:"monster_name"` //反射机制:通过json的tag标签,指定将key-value转换成json时其key值
Age int `json:"monster_age"`
Birthday string `json:"monster_birthday"`
Sal float64 `json:"monster_sal"`
Skill string `json:"monster_skill"`
}
//对结构体的序列化
func testStruct() {
monster := Monster{
Name: "孙悟空",
Age: 500,
Birthday: "1997-01-01",
Sal: 1000000.0,
Skill: "火眼精金,七十二变",
}
//将monster序列化
data, err := json.Marshal(&monster)
if err != nil{
fmt.Println("序列化错误 err=",err)
}
fmt.Println("结构体序列化:",string(data))
}
//将map进行序列化
func testMap() {
var a map[string]interface{} //表示map的key是string类型,value是任意类型
a = make(map[string]interface{})
a["name"]="猪八戒"
a["age"]=400
a["birthday"]="1997-01-02"
a["address"]=[2]string{"高老庄","西天"}
data, err := json.Marshal(a)
if err !=nil {
fmt.Println("序列化错误 err=",err)
}
fmt.Println("map序列化:",string(data))
}
//对切片进行序列化
func testSlice() {
var slice []map[string]interface{}
a := make(map[string]interface{})
a["name"]="沙僧"
a["age"]=300
a["birthday"]="1996-01-03"
slice = append(slice,a)
b := make(map[string]interface{})
b["name"]="唐僧"
b["age"]=600
b["birthday"]="1995-01-04"
slice = append(slice,b)
data, err := json.Marshal(slice)
if err != nil{
fmt.Println("序列化错误 err=",err)
}
fmt.Println("slice序列化:",string(data))
}
func main() {
//将结构体,map,切片进行序列化
testStruct()
testMap()
testSlice()
}
unserialfunc.go
package main
import (
"encoding/json"
"fmt"
)
type Monster struct {
Name string
Age int
Birthday string
Sal float64
Skill string
}
//将json字符串反序列化成结构体
func unMarshStruct() {
//str在项目开发中,是通过网络传输获取到或者时读取文件获取到的
str := "{\"Name\":\"孙悟空\",\"Age\":500,\"Birthday\":\"1997-01-01\",\"Sal\":100000.0,\"Skill\":\"火眼精金,七十二变\"}"
var monster Monster
err := json.Unmarshal([]byte(str),&monster)
if err != nil {
fmt.Println("反序列化成结构体失败:",err)
}
fmt.Println("反序列化成结构体后为:",monster)
fmt.Println("名字:",monster.Name)
}
//将json字符串反序列化成map
func unMarshMap() {
str := "{\"Name\":\"猪八戒\",\"Age\":400,\"Birthday\":\"1997-01-02\",\"address\":\"高老庄,西天\",\"Skill\":\"三十六变\"}"
var a map[string]interface{}
err := json.Unmarshal([]byte(str),&a)
if err != nil {
fmt.Println("反序列化成map失败:",err)
}
fmt.Println("反序列化成map后为:",a)
}
//将json字符串反序列化成切片
func unMarshSlice() {
str := "[{\"age\":300,\"birthday\":\"1996-01-03\",\"name\":\"沙僧\"},{\"age\":600,\"birthday\":\"1995-01-04\",\"name\":\"唐僧\"}]"
var b []map[string]interface{}
err := json.Unmarshal([]byte(str),&b)
if err != nil {
fmt.Println("反序列化成切片失败:",err)
}
fmt.Println("反序列化成切片后为:",b)
}
func main() {
unMarshStruct()
unMarshMap()
unMarshSlice()
}