概述

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  }*/

分割我