(1). 标准库内建的JSON包:
对结构体进行JSON序列化和反序列化
json.func Marshal(v interface{}) ([]byte, error) // 接收指针型结构体指针v,返回序列化之后的JSON二进制
json.func Unmarshal(data []byte, v interface{}) error // 接收JSON的二进制字符串data, 指针型结构体指针v
(2). 描述:
①. 默认使用JSON的名称是字段名称(即Field名称)
②. 首字母大写才可以被导出
③. 不是所有的类型都可以序列化:
a. 支持的类型:
string、bool、数字类型、数组和切片、结构体、map
b. 不支持的类型:
Channel、complex、function类型无法进行json序列化
④. 数组和切片:
a. 数组和切片被编码为json数组
b. 对nil类型的数组和切片被序列化为json的null值
c. 在map编码时,key为转换为字符串,指针型的对象被序列化时,会指向实际的值.
d. interface序列化为interface包含的值
⑤. Json的key必须是字符串
⑥. 结构体中的存在循环数据结构,序列化时不会被处理:
a. 因为将循环结构传递给Marshal,将会导致无限递归,造成死循环.
(3). 结构体自定义字段名称:
①. 使用field tag格式来定义字段名称:
a. 将json做为tag key
b. tag value可以是一个值,也可以是多个值(多个值之间用逗号分割)
②. 格式:
JSON tag key: name,[omitempty,-]
③. json tag的第一个值做为输出的字段名称
④. 空值处理:
a. json为了优化序列化之后的数据量,需要做空值的处理
b. 在json tag中添加omitempty标识就会忽略空值字段
c. 空值的指的是各种类型的零值,如bool的false、整形的0、nil的interface值、空数组/切片、空map、空字符串都被定义成空值
d. 字段的值为空值时,该字段就会被忽略,不会出现在json数据中
e. 如果想绝对忽略某个字段,可以使用"-"来标记字段名称,那么在json序列化的过程中,会始终处理该字段
⑤. 使用string来标记字段:
a. [string]标记,定义bool、浮点、整形类型使用字符串编码
b. 可以将数字类型的字段以字符串型来编码和解码,类型有限制,只能用于bool、浮点、整形类型字段
⑥. 临时添加字段:
a. 如果需要临时添加字段、修改字段
b. 可以使用内嵌结构体的方法来解决
c. 也可以使用合并多个结构体的方法
(4). example:
type User struct {
Name string
}
u := User{
Name: "david",
}
data, err := json.Marshal(&u)
fmt.Println(string(data)) // {"Name": "david"}
// 添加tag
type User struct {
Name string `json:"name"`
}
u := User{
Name: "david",
}
data, err := json.Marshal(&u)
fmt.Println(string(data)) // {"name": "david"}
// 添加tag
type User struct {
Id int `json:"id,string"`
Name string `json:"name"`
Age int `json:"age,omitempty"`
Address string `json:"-"`
}
u := User{
Id: 12,
Name: "david",
Age: 0,
Address: "david address"
}
data, err := json.Marshal(&u)
fmt.Println(string(data)) // {"id":"12", "name":"david"}
u2 := &User{}
json.Unmarshal(data, u2)
fmt.Println(u2) // &{Id:12, Name:david, Age:0, Address:"david address"}
// 反序列化
type User struct {
Id int `json:"id,string"`
Name string `json:"name"`
}
data := []byte(`{"id":"12", "name":"david"}`)
u2 := &User{}
json.Unmarshal(data, u2)
fmt.Println(u2)
(5). 高性能JSON库:
jsoniter [json-iterator]
①. 快,并且更快,比标准的快6倍
②. 支持java和go
③. 100兼容JSON标准库,一行代码迁移到jsoniter
④. 安装:
go get github.com/json-iterator/go
// 新增一行
var json = jsoniter.ConfigCompatibleWithStandardLibrary
type User struct {
Name string
}
u := User{
Name: "david",
}
data, err := json.Marshal(&u)
fmt.Println(string(data)) // {"Name": "david"}