基本说明
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
", 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)
}
- 在反序列化一个json字符串时,要确保反序列化后的数据类型和原来序列化前的数据类型一致
- 如果json字符串是通过程序获取的,则不需要在的双引号转移处理