257_尚硅谷_反序列化介绍和应用实例
1.json的反序列化
2.json字符串使用json.Unmarshal()方法反序列化成结构体
package main
import (
"encoding/json"
"fmt"
)
// 定义一个结构体
type Monster struct {
// ! 例:`json:"monster_name"`, 这是反射机制,理解为重定义序列化结构体后的字段名
Name string `json:"monster_name"`
Age int `json:"monster_age"`
Birthday string `json:"monster_birthday"`
Sal float64 `json:"monster_sal"`
Skill string `json:"monster_skill"`
}
// 演示将json字符串, 反序列化成 struct
func unmarshalStruct() {
//! 用\ 格式化json字符串,使用json.Unmarshal()方法, 反序列化成结构体
str := "{\"monster_name\":\"name1\", \"monster_age\":500,\"monster_birthday\":\"2021-11-11\",\"monster_sal\":8000,\"monster_skill\":\"skill1\"}"
// 定义一个Monster实例
var monster Monster
err := json.Unmarshal([]byte(str), &monster)
if err != nil {
fmt.Printf("unmarshal err= %v\n", err)
}
fmt.Printf("===============json字符串反序列化成结构体===============\n")
fmt.Printf("monster= %v, \nmonster.monster_name= %v, \nmonster.monster_age= %v, \nmonster.monster_birthday= %v, \nmonster.monster_sal= %v, \nmonster.monster_skill= %v",
monster, monster.Name, monster.Age, monster.Birthday, monster.Sal, monster.Skill)
}
func main() {
unmarshalStruct()
}
3.json字符串使用json.Unmarshal()方法反序列化成map
package main
import (
"encoding/json"
"fmt"
)
// 演示将json字符串, 反序列化成 map
func unmarshalMap() {
//! 用\ 格式化json字符串,使用json.Unmarshal()方法, 反序列化成 map
str := "{\"monster_name\":\"name1\", \"monster_age\":500,\"monster_birthday\":\"2021-11-11\",\"monster_sal\":8000,\"monster_skill\":\"skill1\"}"
var a map[string]interface{}
// 执行反序列化
// ! 注意:反序列化map, 不需要make,因为make操作被封装到 Unmarshal函数
err := json.Unmarshal([]byte(str), &a)
if err != nil {
fmt.Printf("unmarshal err= %v\n", err)
}
fmt.Printf("===============json字符串反序列化成 map===============\n")
fmt.Printf("%v", a)
}
func main() {
unmarshalMap()
}
4.json字符串使用json.Unmarshal()方法反序列化成切片
package main
import (
"encoding/json"
"fmt"
)
// 演示将json字符串, 反序列化成 切片
func unmarshalSlice() {
//! 用\ 格式化json字符串,使用json.Unmarshal()方法, 反序列化成 map
str := "[{\"monster_name\":\"name1\", \"monster_age\":500,\"monster_birthday\":\"2021-11-11\",\"monster_sal\":8000,\"monster_skill\":\"skill1\"}," +
"{\"monster_name\":\"name2\", \"monster_age\":500,\"monster_birthday\":\"2021-11-11\",\"monster_sal\":8000,\"monster_skill\":\"skill2\"}]"
var slice []map[string]interface{}
// 执行反序列化
// ! 注意:反序列化map, 不需要make,因为make操作被封装到 Unmarshal函数
err := json.Unmarshal([]byte(str), &slice)
if err != nil {
fmt.Printf("unmarshal err= %v\n", err)
}
fmt.Printf("===============json字符串反序列化成 切片===============\n")
fmt.Printf("%v", slice)
}
func main() {
unmarshalSlice()
}
5.如果json字符串是通过程序获取到的, 则不需要再对双引号转义处理
package main
import (
"encoding/json"
"fmt"
)
func testMap() string {
// 定义一个map
var a map[string]interface{}
a = make(map[string]interface{})
a["monster_name"] = "name1~~~~~~"
a["monster_age"] = 500
a["monster_birthday"] = "2021-11-11"
a["monster_sal"] = 8000
a["monster_skill"] = "skill1"
// json.Marshal(a)执行序列化,获得json字符串
data, err := json.Marshal(a)
if err != nil {
fmt.Printf("序列化错误 err= %v\n", err)
}
// 输出序列化后的结果
// fmt.Printf("a map 序列化后= %v\n", string(data))
return string(data)
}
// todo 2) 如果json字符串是通过程序获取到的, 则不需要再对""双引号转义处理
// 演示将json字符串, 反序列化成 map
func unmarshalMap() {
//! 用\ 格式化json字符串,使用json.Unmarshal()方法, 反序列化成 map, 直接写字符串是需要双引号转义的
// str := "{\"monster_name\":\"name1\", \"monster_age\":500,\"monster_birthday\":\"2021-11-11\",\"monster_sal\":8000,\"monster_skill\":\"skill1\"}"
str := testMap()
var a map[string]interface{}
// 执行反序列化
// ! 注意:反序列化map, 不需要make,因为make操作被封装到 Unmarshal函数
err := json.Unmarshal([]byte(str), &a)
if err != nil {
fmt.Printf("unmarshal err= %v\n", err)
}
fmt.Printf("===============json字符串反序列化成 map===============\n")
fmt.Printf("%v", a)
}
func main() {
unmarshalMap()
}
浙公网安备 33010602011771号