encoding/json

79 阅读3分钟

image.png

package main

//serial序列化

import (
	"encoding/json"
	"fmt"
	"log"
)

// 定义一个结构体
type Monster struct {
	Name string `json:"name"` //反射机制
	/*
		对于结构体的序列化,如果我们希望序列化后的key 的名字,又我们自己重新制定,
		"Name":"牛魔王","Age":500-->"name":"牛魔王","age":500
		那么可以给struct指定一个 tag 标签.

		name string(上面的)
		name:"牛魔王"(下面的)
		直接将Name改成name,在json.Marshal(&monster)中肯定会出差,name丢掉了,因为name小写是私有的
		json.Marshal(&monster)是跨包去使用一个不可导出的字段name肯定会出差,丢掉了一个name字段
	*/
	Age      int `json:"age"`
	Birthday string
	Sal      float64
	Skill    string
}

func testStruct() {
	//演示
	monster := Monster{
		Name:     "牛魔王",
		Age:      500,
		Birthday: "2011-11-11",
		Sal:      8000.0,
		Skill:    "牛魔拳",
	}

	// 	func Marshal(v interface{}) ([]byte, error)
	// Marshal函数返回v的json编码。
	//接收空的接口类型,那也就是说任何一种数据类型都可以让他进行序列化,
	//成功返回byte切片,失败返回error

	//将monster序列化
	//因为接口是引用传递,所以给接口传参也要指针类型,而monster是结构体所以得加地址&
	data, err := json.Marshal(&monster)
	if err != nil {
		log.Fatal(err)
	}

	//因为data是byte切片,直接输出是看不到内容的,又是看到一堆数字,因此想看到数据得转成数据类型
	//注意不加上string(),输出的是一串数字,下面的Map同理
	fmt.Printf("monster序列化后=%v\n", string(data))
}

// 将 map 进行序列化
func testMap() {

	//定义一个map
	//这个map key是字符串,而值是任意接口类型
	var a map[string]interface{}
	//使用map之前需要make
	a = make(map[string]interface{})

	a["name"] = "红孩儿"
	a["age"] = 300
	a["address"] = "洪崖洞"

	//map本身是指针类型,按引用方式传送,所以不需要加地址&
	//但成功后依旧返回的是byte切片给data
	//将 a 这个 map 进行序列化
	data, err := json.Marshal(a)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("a map类型序列化后=%v\n", string(data))
	//输出后的顺序不对,不用理他,随机的
}

// 演示对切片进行序列化, 我们这个切片 []map[string]interface{}
func testSlice() {
	//现在这个切片里面有多个map,做的稍微复杂点
	var slice []map[string]interface{}
	var m1 map[string]interface{}
	//使用map之前需要make
	m1 = make(map[string]interface{})
	m1["name"] = "jack"
	m1["age"] = 7
	m1["address"] = "北京"
	//切片可拼接
	slice = append(slice, m1)

	var m2 map[string]interface{}
	m2 = make(map[string]interface{})
	m2["name"] = "tom"
	m2["age"] = 6
	//注意下面这里的语法
	m2["address"] = [2]string{"上海", "深圳"}
	slice = append(slice, m2)

	//将切片进行序列化操作
	data, err := json.Marshal(slice)
	if err != nil {
		// log.Fatal(err)
		fmt.Println("切片序列化错误 err=%v\n", err)
	}
	// 输 出 序 列 化 后 的 结 果
	fmt.Printf("slice 序列化后=%v\n", string(data))

}

// 对基本数据类型序列化,对基本数据类型进行序列化意义不大
func testFloat64() {
	var num1 float64 = 2345.6

	data, err := json.Marshal(num1)
	if err != nil {
		log.Fatal(err)
	}
	//注意末尾是f
	fmt.Printf("float64序列后 data=%v\n", string(data))
}

func main() {
	//演示将结构体, map , 切片进行序列号
	testStruct()
	testMap()
	testSlice()   //演示对切片的序列化
	testFloat64() //演示对基本数据类型的序列化

}

2.json.Unmarshal

image.png