golang json序列化与反序列化

1、json的序列化

介绍.
  json序列化是指,将有key-value结构的数据类型(比如结构体、map、 切片)序列化成json字符串的操作。
应用案例
  这里我们介绍一下结构体、map和切片的序列化,其它数据类型的序列化类似。

package main

import (
	"encoding/json"
	"fmt"
)

//定义一个结构体
type Monster struct {
	Name  string
	Age   int
	Sal   float64
	Skill string
}

func testStruct() {
	monster := Monster{
		Name:  "牛魔王",
		Age:   100,
		Sal:   3000.0,
		Skill: "牛魔拳",
	}
	//将monster系列化
	data, err := json.Marshal(&monster)
	if err != nil {
		fmt.Printf("序列化错误 err=%v\n", err)
	}
	//输出序列化结果
	fmt.Printf("monster序列化后=%v\n", string(data))
}

//将map进行序列化
func testMap() {
	//定义一个map
	var a map[string]interface{}
	a = make(map[string]interface{})
	a["name"] = "tom"
	a["age"] = 29
	a["address"] = "美国"
	//将map序列化
	data, err := json.Marshal(a)
	if err != nil {
		fmt.Printf("序列化错误err=%v\n", err)
	}
	//输出序列化结果
	fmt.Printf("map序列化后=%v\n", string(data))
}

//对切片进行序列化
func testSlice() {
	var slice []map[string]interface{}
	var m1 map[string]interface{}
	m1 = make(map[string]interface{})
	m1["name"] = "Jack"
	m1["age"] = 3
	m1["address"] = "北京"
	slice = append(slice, m1)

	var m2 map[string]interface{}
	m2 = make(map[string]interface{})
	m2["name"] = "tom"
	m2["age"] = 10
	m2["address"] = [2]string{"墨西哥", "夏威夷"}
	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()  {
	var num1 float64=123.2
	//对切片进行序列化
	data, err := json.Marshal(num1)
	if err != nil {
		fmt.Printf("序列化错误err=%v\n", err)
	}
	//输出序列化结果
	fmt.Printf("num1 序列化后=%v\n", string(data))
}
func main() {
	testStruct()
	testMap()
	testSlice()
	testFloat64()
}

➢注意事项
  对于结构体的序列化,如果我们希望序列化后的key的名字,又我们自己重新制定,那么可以给struct指定一个tag标签。

//定义一个结构体
type Monster struct {
	Name  string `json:"monster_name"` //反射机制
	Age   int `json:"monster_age"`
	Sal   float64
	Skill string
}

加上tag后
在这里插入图片描述

2、json反序列化

介绍.
  json反序列化是指,将json字符串反序列化成对应的数据类型(比如结构体、map、切片)的操作
➢应用案例
  这里我们介绍一下将json字符串反序列化成结构体、map和切片

package main

import (
	"encoding/json"
	"fmt"
)

//定义一个结构体
type Monster struct {
	Name  string
	Age   int
	Sal   float64
	Skill string
}

//将json字符串反序列化成struct
func unmarshalStruct() {
	//说明:str在项目开发中,是通过网络传输获取到..或者是读取文件获取到
	str := " {\"Name\":\"牛魔王\",\"Agel\":500,\"Sal\":10.2,\"Skill\":\"牛魔拳\"}"
	//定义一个Monster实例
	var monster Monster
	err := json.Unmarshal([]byte(str), &monster)
	if err != nil {
		fmt.Printf("unmarshal err=%v\n", err)
	}
	fmt.Printf("反序列化后 monster=%v monster.Name=%v\n", monster, monster.Name)

}

//将json字符串反序列化成map
func unmarshalMap() {
	str := " {\"Name\":\"牛魔王\",\"Agel\":500,\"Sal\":10.2}"
	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("反序列化后 a=%v\n", a)
}

//将json反序列化为切片
func unmarshalSlice() {
	str := "[ {\"address\":\"北京\",\"age\":\"7\",\"name\":\"jack\"}," +
		" {\"address\":[\"墨西哥\",\"夏威夷\"],\"age\":\"20\",\"name\":\"tom\"}]"
	//定义一个slice
	var slice []map[string]interface{}
	//反序列化,不需要make,因为make操作被封装到Unmarshal函数
	err := json.Unmarshal([]byte(str), &slice)
	if err != nil {
		fmt.Printf("unmarshal err=%v\n", err)
	}
	fmt.Printf("反序列化后 slice=%v\n", slice)

}

func main() {
	unmarshalStruct()
	unmarshalMap()
	unmarshalSlice()
}

➢对上面代码的小结说明
(1)在反序列化一个json字符串时,要确保反序列化后的数据类型和原来序列化前的数据类型一致。
(2)如果json字符串是通过程序获取到的,则不需要再对“转义处理。
在这里插入图片描述

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值