首页 > 文章列表 > Golang中Json的序列化和反序列化的使用

Golang中Json的序列化和反序列化的使用

golang
384 2022-12-17

 JSON:

  • JSON(JavaScript Object Notation):是一种轻量级的数据交换格式。 它是基于 ECMAScript 规范的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
  • 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于计算机解析和生成,并有效的 提升网络传输效率。
  • Json易于机器解析和生成,并有效的提升网络传输效率,通常程序传输时会先将数据序列化成json字符串,接收方再反序列化成原数据类型
  • 所有的数据类型都可以通过Json表示
  • Json.cn这个网站可以验证Json格式
  • 序列化用json.Marshal()
  • 反序列化用json.Unmarshal(),反序列化时要和序列化前的数据类型保持一致

创建格式:

基本数据类型序列化:

func testBasic() {

	num := 1.111

	marshal, err := json.Marshal(num)

	if err != nil {

		fmt.Println("json.Marshal err:", err)

	}

	fmt.Println("序列化后:", string(marshal)) // 序列化后: 1.111

}

结构体序列化:

func main() {

	testStudent()

}

/**

type Student struct {

	Name     string

	Age      int

	Birthday string

	Address  string

}

*/

// 如果加上`json:"student_name"`,序列化以后的数据字段是返回指定格式的,可以小写,json固定,后面的随意

type Student struct {

	// 变量首字母大写才能被解析

	Name     string `json:"student_name"`

	Age      int    `json:"student_age"`

	Birthday string `json:"student_birthday"`

	Address  string `json:"student_address"`

}





func testStudent() {

	student := Student{

		Name:     "itzhuzhu",

		Age:      24,

		Birthday: "1998-01-01",

		Address:  "广州市天河区",

	}

	marshal, err := json.Marshal(&student)

	if err != nil {

		fmt.Println("json.Marshal err:", err)

	}

	fmt.Println("序列化后:", string(marshal)) // 序列化后:{"Name":"itzhuzhu","Age":24,"Birthday":"1998-01-01","Address":"广州市天河区"}

}

map序列化:

func testMap() {

	var m map[string]interface{}

	m = make(map[string]interface{})

	m["name"] = "韩信"

	m["age"] = 23

	m["address"] = "广州"



	marshal, err := json.Marshal(m)

	if err != nil {

		fmt.Println("json.Marshal err:", err)

	}

	fmt.Println("序列化后:", string(marshal)) // 序列化后: {"address":"广州","age":23,"name":"韩信"}

}

切片序列化:

func testSlice() {

	var slice []map[string]interface{}

	var m map[string]interface{}

	m = make(map[string]interface{})

	m["name"] = "韩信"

	m["age"] = 23

	m["address"] = "广州"

	slice = append(slice, m)

	marshal, err := json.Marshal(m)

	if err != nil {

		fmt.Println("json.Marshal err:", err)

	}

	fmt.Println("序列化后:", string(marshal)) // 序列化后: {"address":"广州","age":23,"name":"韩信"}

}

反序列化为结构体:

func deserialize() {

	str := "{\"Name\":\"itzhuzhu\",\"Age\":24,\"Birthday\":\"1998-01-01\",\"Address\":\"广州市天河区\"}"



	// 使用Unmarshal反序列化

	var student Student

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

	if err != nil {

		fmt.Println("json.Unmarshal err:", err)

	}



	fmt.Println("反序列化后:", student) // 反序列化后: {itzhuzhu 24 1998-01-01 广州市天河区}

}

反序列化为map:

func deserializeMap() {

	str := " {\"address\":\"广州\",\"age\":23,\"name\":\"韩信\"}"



	// 反序列化的时候不需要make,被封装到Unmarshal中了

	var m map[string]interface{}



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

	if err != nil {

		fmt.Println("json.Unmarshal err:", err)

	}



	fmt.Println("反序列化后:", m) // map[address:广州 age:23 name:韩信]

}

反序列化为切片:

func deserializeSlice() {

	str := " [{\"address\":\"广州\",\"age\":23,\"name\":\"韩信\"}]"



	var slice []map[string]interface{}



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

	if err != nil {

		fmt.Println("json.Unmarshal err:", err)

	}



	fmt.Println("反序列化后:", slice) // 反序列化后: [map[address:广州 age:23 name:韩信]]

}