概述
encoding/json
蕴含了 JSON 相干解决办法。
例子
构造体转为 JSON 字符串
调用 json.Marshal()
办法实现。
package mainimport ( "encoding/json" "fmt")type person struct { Name string `json:"name"` Age int `json:"age"` addr string `json:"addr"` // 该属性转 JSON 时会被疏忽}func main() { tom := person{ // 应用字面量初始化 Name: "Tom", Age: 6, addr: "???", } tomJson, err := json.Marshal(tom) if err != nil { panic(err) } fmt.Printf("json.Marshal(tom) = %s\n", tomJson) // 从输入字符串中能够看到,并没有 addr 属性}// $ go run main.go// 输入如下 /** json.Marshal(tom) = {"name":"Tom","age":6}*/
JSON 字符串转为构造体
调用 json.Unmarshal()
办法实现。
package mainimport ( "encoding/json" "fmt")type person struct { Name string `json:"name"` Age int `json:"age"` addr string `json:"addr"` // 该属性转 json 时会被疏忽}func main() { // 留神: JSON 字符串格局肯定要正确,否则会报错 tomJson := `{ "name": "Tom", "age": 6, "addr": "???"}` var tom person err := json.Unmarshal([]byte(tomJson), &tom) if err != nil { panic(err) } // 从输入字符串中能够看到,并没有为 addr 属性赋值 fmt.Printf("Tom's name is %s, age is %d, addr is %s\n", tom.Name, tom.Age, tom.addr)}// $ go run main.go// 输入如下 /** Tom's name is Tom, age is 6, addr is*/
输入格式化 JSON 字符串
调用 json.MarshalIndent()
办法实现。
package mainimport ( "encoding/json" "fmt")type person struct { Name string `json:"name"` Age int `json:"age"` Hobby []string `json:"hobby"`}func main() { tom := person{ // 应用字面量初始化 Name: "Tom", Age: 6, Hobby: []string{ "reading", "coding", "movie", }, } // 前缀符为空字符串,缩进符为两个空格 formatted, err := json.MarshalIndent(tom, "", " ") if err != nil { panic(err) } fmt.Printf("json.MarshalIndent(tom) = \n%s\n", formatted)}// $ go run main.go// 输入如下 /** json.MarshalIndent(tom) = { "name": "Tom", "age": 6, "hobby": [ "reading", "coding", "movie" ] }*/
疏忽零值
通过 omitempty
关键字实现。
package mainimport ( "encoding/json" "fmt")type person struct { Name string `json:"name"` Age int `json:"age"` Hobby []string `json:"hobby,omitempty"` // omitempty 关键字将字段标记为疏忽零值}func main() { tom := person{ // 应用字面量初始化 Name: "Tom", Age: 6, } // 前缀符为空字符串,缩进符为两个空格 formatted, err := json.MarshalIndent(tom, "", " ") if err != nil { panic(err) } fmt.Printf("json.MarshalIndent(tom) = \n%s\n", formatted)}// $ go run main.go// 输入如下 /** json.MarshalIndent(tom) = { "name": "Tom", "age": 6 }*/
保留零值
某些场景下,须要在输入 JSON 字符串时主动疏忽零值,然而在将 JSON 字符串转为指标构造体时,须要保留零值。
能够通过将字段设置为 指针 类型即可。
package mainimport ( "encoding/json" "fmt")type person struct { Name string `json:"name"` Age int `json:"age"` HasMoney *bool `json:"hasMoney,omitempty"`}func main() { tomJson := `{ "name": "Tom", "age": 6, "hasMoney": false}` var tom person err := json.Unmarshal([]byte(tomJson), &tom) if err != nil { panic(err) } fmt.Printf("Tom's name is %s, age is %d, hasMoney is %t\n", tom.Name, tom.Age, *tom.HasMoney)}// $ go run main.go// 输入如下 /** Tom's name is Tom, age is 6, hasMoney is false*/
疏忽公开值
某些场景下,须要将构造体字段设置为公开可导出,然而又不心愿 JSON 序列化时输入该字段,
能够应用 -
符号标识。
package mainimport ( "encoding/json" "fmt")type person struct { Name string `json:"name"` Age int `json:"age"` Hobby []string `json:"-"`}func main() { tom := person{ // 应用字面量初始化 Name: "Tom", Age: 6, Hobby: []string{ "reading", "coding", "movie", }, } // 前缀符为空字符串,缩进符为两个空格 formatted, err := json.MarshalIndent(tom, "", " ") if err != nil { panic(err) } fmt.Printf("json.MarshalIndent(tom) = \n%s\n", formatted)}// $ go run main.go// 输入如下 /** json.MarshalIndent(tom) = { "name": "Tom", "age": 6 }*/