257_尚硅谷_反序列化介绍和应用实例

1.json的反序列化1.json的反序列化

2.json字符串使用json.Unmarshal()方法反序列化成结构体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()方法反序列化成map3.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()方法反序列化成切片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字符串是通过程序获取到的, 则不需要再对双引号转义处理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()
}

posted on 2026-02-27 17:15  与太阳肩并肩  阅读(0)  评论(0)    收藏  举报

导航