介绍
json序列化是指: 将有key-value的结构体的数据类型(比如结构体、map、切片)序列化成json字符串的操作,对基本数据类型数列化意义不大
应用
type Monster struct {
Name string `json:"monster_name"` //反射机制
Age int
Grade int
}
func (u *User) OrgList(ctx *gin.Context) {
//以下是序列化
monster := Monster{
Name: "小牛",
Age: 3,
Grade: 8,
}
//将结构体序列化
data, err := json.Marshal(monster)
if err != nil {
fmt.Printf("序列号错误 err=%v\n", err)
}
//输出序列化后的结果
fmt.Printf("结构体 序列化后=%v\n", string(data))
结果:
结构体 序列化后={"monster_name":"小牛","Age":3,"Grade":8}
//将map进行序列化
var school map[string]interface{}
school = map[string]interface{}{}
school["name"] = "杭州一小"
school["address"] = "杭州市滨江大道12号"
mapData, err := json.Marshal(school)
if err != nil {
fmt.Printf("序列化错误 err=%v\n", err)
}
fmt.Printf("map 序列化后=%v\n", mapData)
结果:
map 序列化后={"address":"杭州市滨江大道12号","name":"杭州一小"}
//对切片进行序列化
var slice []map[string]interface{}
var m1 map[string]interface{}
m1 = make(map[string]interface{})
m1["name"] = "jack"
m1["address"] = "天津"
slice = append(slice, m1)
sliceData, err := json.Marshal(slice)
if err != nil {
fmt.Printf("序列化错误 err=%v\n", err)
}
fmt.Printf("slice 序列化后=%v\n", sliceData)
结果:
slice 序列化后=[{"address":"天津","name":"jack"}]
}
反序列化
//反序列化
//对结构体
var contraryMonster Monster
conErr := json.Unmarshal([]byte(monsterData), &contraryMonster)
if conErr != nil {
fmt.Printf("反序列化错误 err=%v\n", conErr)
}
fmt.Printf("结构体反序列化后=%v, 名字是:%v \n", contraryMonster, contraryMonster.Name)
结果:
结构体反序列化后={小牛 3 8}, 名字是:小牛
//对map进行反序列化
var contrarySchool map[string]interface{}
//注意: 反序列化map不需要make,因为make操作被封装到Unmarshal函数
conErr = json.Unmarshal([]byte(mapData), &contrarySchool)
if conErr != nil{
fmt.Printf("反序列化错误 err=%v\n", conErr)
}
fmt.Printf("map反序列化后=%v\n", contrarySchool)
结果:
map反序列化后=map[address:杭州市滨江大道12号 name:杭州一小]
//对切片进行反序列化
var contrarySlice []map[string]interface{}
//反序列化slice不需要make, 因为make操作被封装到Unmarshal 函数
conErr = json.Unmarshal([]byte(sliceData), &contrarySlice)
if conErr != nil {
fmt.Printf("反序列化错误 err=%v\n", conErr)
}
fmt.Printf("map反序列化后=%v\n", contrarySlice)
map反序列化后=[map[address:天津 name:jack]]