(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"}