【go】【json】json格式初体验及序列化

1.json是一种轻量级的数据交换格式
JavaScript object notation

通常网络传输过程中,把数据(结构体、map)序列化成json字符串。再反序列化成原来的数据类型

2.json用键值对保存数据
key写在前面用“”包裹,用:分割,再跟着value
键值对之间用逗号隔开
每一个数据对象用{}包裹

json检测网站
json.cn

3.序列化
将有key-value结构的数据类型(结构、map、切片)序列化成json字符串

注意结构体字段必须!!大写
不然不能导出,json包用不了你的数据

type Monster struct{
	Name string
	Age int
	Birthday string
	Skill string
	Sal float64
}

func testStruct() {
	monster := Monster{
		Name : "wukong",
		Age : 10000,
		Birthday : "322-4-2",
		Skill : "fly",
		Sal : 23,
	}
	//将monster序列化
	//Marshal函数返回v interface{}的json序列化编码
	//其可以接收任意类型 若失败返回error
	data, err := json.Marshal(&monster)
	if err != nil {
		fmt.Printf("序列化失败 err =%v\n", err)
	}
	//输出序列化后的结果
	fmt.Printf("monster: %v\n", string(data))
}

//将map序列化
func testMap() {
	var a map[string]interface{}
	//使用map 先make
	a = make(map[string]interface{})
	a["name"] = "spider"
	a["age"] = 33
	a["skill"] = "swim"
	//map本身是引用类型
	data, err := json.Marshal(a)
	if err != nil {
		fmt.Printf("序列化失败 err =%v\n", err)
	}
	//输出序列化后的结果
	//可以看到map的存储是无序的
	fmt.Printf("a: %v\n", string(data))
}

//slice序列化
func testSlice() {
	var slice []map[string]interface{}
	var m1 map[string]interface{}
	m1 = make(map[string]interface{})
	m1["name"] = "theShy"
	m1["age"] = 20
	m1["address"] = "shanghai"
	slice = append(slice, m1)

	var m2 map[string]interface{}
	m2 = make(map[string]interface{})
	m2["name"] = "rookie"
	m2["age"] = 22
	m2["address"] = [2]string{"shanghai", "wuhu"}
	slice = append(slice, m2)
	data, err := json.Marshal(slice)
	if err != nil {
		fmt.Printf("序列化失败 err =%v\n", err)
	}
	//输出序列化后的结果
	fmt.Printf("slice:  %v\n", string(data))
}

//基本类型序列化 实际上没什么意义
func testFloat64(){
	n1 := 1313.12
	data, err := json.Marshal(n1)
	if err != nil {
		fmt.Printf("序列化失败 err =%v\n", err)
	}
	//输出序列化后的结果
	fmt.Printf("monster: %v\n", string(data))
}

func main(){
	testStruct()
	testMap()
	testSlice()
	testFloat64()
}

4.使用tag序列化

type Monster struct{
	Name string `json:"name"` //反射机制
	Age int `json:"monster_age"`
	Birthday string
	Skill string
	Sal float64
}

字段本身必须大写,可以特别指定序列化后的名字,用tag

5.反序列化
将json字符串 反序列化为对应的类型

反序列化后 最好保证 与序列化前类型一致
如果是不同的结构,但是字段完全一样,其实也能反序列化成功

type Monster struct{
	Name string `json:"name"` //反射机制
	Age int `json:"monster_age"`
	Birthday string
	Skill string
	Sal float64
}

func unmarshalStruct() {
	//str 通过网络传输得到 或者读取文件得到
	str := "{\"Name\":\"wukong\",\"Age\":10000,\"Birthday\":\"322-4-2\",\"Skill\":\"fly\",\"Sal\":23}"
	var monster Monster
	err := json.Unmarshal([]byte(str), &monster)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Printf("monster = %v\n", monster)
	fmt.Println(monster.Name)
}

func unmarshalMap() {
	//str 通过网络传输得到 或者读取文件得到
	str := "{\"Name\":\"wukong\",\"Age\":10000,\"Birthday\":\"322-4-2\",\"Skill\":\"fly\",\"Sal\":23}"
	var a map[string]interface{}
	//反序列化时不需要make
	//make被封装到unmarshal中
	err := json.Unmarshal([]byte(str), &a)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Printf("a = %v\n", a)
	fmt.Println(a["Sal"])
}

func unmarshalSlice() {
	//str 通过网络传输得到 或者读取文件得到
	str := "[{\"Name\":\"wukong\",\"Age\":10000,\"" +
		"Birthday\":\"322-4-2\",\"Skill\":\"fly\",\"Sal\":23}]"
	var slice []map[string]interface{}
	//反序列化时不需要make
	//make被封装到unmarshal中
	err := json.Unmarshal([]byte(str), &slice)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Printf("slice = %v\n", slice)
	fmt.Println(slice[0])
}

func main(){
	unmarshalStruct()
	unmarshalMap()
	unmarshalSlice()
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值