简单了解Go语言JSON包

基本说明

JSON是一种轻量级的数据交换格式,易于人阅读和编写。同时也易于机器解析和生成

JSON易于机器解析和生成,并有效的提升网络传输效率,通常程序在网络传输时会先将数据(结构体、map等)序列化成JSON字符串,到接收方得到JSON字符串时,在反序列化恢复成原来的数据类型(结构体、map等)。

序列化

JSON序列化,将有key-value结构的数据类型(比如结构体、map、切片)序列化成JSON字符串的操作

// 结构体的序列化
type Monster struct {
	Name     string
	Age      int
	Birthday string
	Sal      float64
	Skill    string
}

func StructToJson() {
	monster := Monster{
		Name:     "牛魔王",
		Age:      500,
		Birthday: "2020-12-23",
		Sal:      8000.0,
		Skill:    "牛魔拳",
	}

	data, err := json.Marshal(&monster)

	if err != nil {
		fmt.Printf("序列号错误 err = %v \n", err)
	}

	fmt.Printf(string(data))
}

type Monster2 struct {
	Name     string `json:"name"` // 使用tag,可以自定义json序列化后的名字,这是使用的反射机制
	Age      int `json:"age"`
	Birthday string
	Sal      float64
	Skill    string
}

// map的序列化
func MapToJson() {
	var a map[string]interface{}
	a = make(map[string]interface{})

	a["name"] = "tom"
	a["age"] = 30
	a["address"] = "English"

	data, err := json.Marshal(a)
	if err != nil{
		fmt.Println(err)
	}

	fmt.Println(string(data))
}


// 切片的序列化
func SliceToJson() {

	var slice []map[string]interface{}
	
	var m1 map[string]interface{}
	var m2 map[string]interface{}

	m1 = make(map[string]interface{})
	m2 = make(map[string]interface{})

	m1["name"] = "tom"
	m1["age"] = 30
	m1["address"] = "English"

	m2["name"] = "jack"
	m2["age"] = 25
	m2["address"] = "English"

	slice = append(slice, m1, m2)

	data, err := json.Marshal(slice)

	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println(string(data))
}

反序列化

json反序列化是指,将json字符串反序列化成对应的数据类型(比如结构体、map、切片)的操作

func JsonToStruct() {
	str := "{\"Name\":\"牛魔王\",\"Age\":500,\"Birthday\":\"2020-12-23\",\"Sal\":8000,\"Skill\":\"牛魔拳\"}"

	var monster Monster

	err := json.Unmarshal([]byte(str), &monster)

	if err == nil {
		fmt.Println(monster)
	}
}

func JsonToMap() {

	str := "{\"address\":\"English\",\"age\":30,\"name\":\"tom\"}"

	var a map[string]interface{}

	json.Unmarshal([]byte(str), &a)

	fmt.Println(a)
}

func JsonToSlice() {

	str := "[{\"address\":\"English\",\"age\":30,\"name\":\"tom\"},{\"address\":\"English\",\"age\":25,\"name\":\"jack\"}]"

	var slice []map[string]interface{}

	json.Unmarshal([]byte(str), &slice)

	fmt.Println(slice)
}

  1. 在反序列化一个json字符串时,要确保反序列化后的数据类型和原来序列化前的数据类型一致
  2. 如果json字符串是通过程序获取的,则不需要在的双引号转移处理
posted @ 2021-01-16 15:15  林林星  阅读(120)  评论(0编辑  收藏  举报