基本介绍
json(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成 key-val
json 易于机器解析和生成,并有效的提升网络传输效率,通常程序在网络传输时,会先将数据(机构提,map等)序列化成json字符串,到接收方得到json字符串时,再反序列化回复成原来的数据类型(结构体,map等)
json格式
在js语言中,一切都是对象,因此,任何的数据类型都可以通过JSON来表示,例如字符串,数字,对象,数组,map,结构体等
JSON键值对是用来保存数据的一种方式,键值对组合中的键名写在前面,并用"" 双引号包裹,使用冒号: 分割,然后"值"
json序列化
结构体序列化
package main
import (
"encoding/json"
"fmt"
)
type Monster struct {
Name string
Age int
Birthday string
Sal float64
Skill string
}
func main() {
monster := Monster{
Name : "牛魔王",
Age : 500,
Birthday : "0253-11-11",
Sal : 8000.0,
Skill : "牛魔拳",
}
// 序列化函数
data,err := json.Marshal(&monster)
if err != nil{
fmt.Println("序列化错误",err)
}
fmt.Printf("monster序列化后的内容%v",string(data))
}
map序列化
package main
import (
"encoding/json"
"fmt"
)
type Monster struct {
Name string
Age int
Birthday string
Sal float64
Skill string
}
func main() {
var a map[string]interface{}
// 使用map需要先make
a = make(map[string]interface{})
a["name"] = "红孩儿"
a["address"] = "火云洞"
// 将map进行序列化
data,err := json.Marshal(a)
if err != nil{
fmt.Println("序列化失败",err)
}
fmt.Println(string(data))
}
对切片序列化
package main
import (
"encoding/json"
"fmt"
)
type Monster struct {
Name string
Age int
Birthday string
Sal float64
Skill string
}
func main() {
// map切片
var z float64 = 1.24
var a []map[string]interface{}
var m1 map[string]interface{}
// 使用map需要先make
m1 = make(map[string]interface{})
m1["name"] = "红孩儿"
m1["address"] = [2]string{"火云洞","背景"}
a = append(a,m1)
// 将map进行序列化
data,err := json.Marshal(a)
data2,err := json.Marshal(z)
if err != nil{
fmt.Println("序列化失败",err)
}
fmt.Println(string(data))
fmt.Printf("%v",string(data2))
}
基本数据类型 同理
json 序列化时对字段首字母大小写的处理
序列化和反序列化时,键名的大小写可能会发生冲突,用json 的tag 解决
package main
import (
"encoding/json"
"fmt"
)
type Monster struct {
Name string `json:"name"` // 反射机制
Age int `json:"age"`
Birthday string `json:"birthday"`
Sal float64 `json:"sal"`
Skill string `json:"skill"`
}
func main() {
monster := Monster{
Name:"牛魔王",
Age:500,
Birthday:"023-1-2",
Sal:8000.0,
Skill:"牛魔拳",
}
// 将map进行序列化
data,err := json.Marshal(monster)
if err != nil{
fmt.Println("序列化失败",err)
}
fmt.Println(string(data))
}
json的反序列化
package main
import (
"encoding/json"
"fmt"
)
type Monster struct {
Name string `json:"name"`
Age int `json:"age"`
Birthday string `json:"birthday"`
Sal float64 `json:"sal"`
Skill string `json:"skill"`
}
func main() {
monster := Monster{
Name:"牛魔王",
Age:500,
Birthday:"023-1-2",
Sal:8000.0,
Skill:"牛魔拳",
}
// 将map进行序列化
data,err := json.Marshal(monster)
if err != nil{
fmt.Println("序列化失败",err)
}
dataStr := string(data)
fmt.Println(dataStr)
// 反序列化时,对于需要make的类型,内部源码已经make过了
err2 := json.Unmarshal([]byte(dataStr),&monster)
if err2 != nil{
fmt.Println("反序列化失败",err2)
}
fmt.Println(monster)
}
细节
- 在反序列化一个JSON 字符串时,要确保反序列化之后的数据类型和原来序列化前的数据类型(里面的字段)保持一致