相关的包:

  1. import (
  2. "encoding/json"
  3. "fmt"
  4. )

一、序列化结构体

使用 json.Marshal 将数据序列化为字节数组。适用于结构体、Map。

type Person struct {
    Name string
    Age int
    Sex int
}

func main() {
    person := Person{Name: "xiaoyu", Age: 18, Sex: 1}
    b, err := json.Marshal(person) // 将结构体序列号为json字节数组
    if err != nil {
        fmt.Println(err.Error())
        return
    }
    fmt.Println(string(b)) // 将json字节数组转化为字符串
}

打印出:

{"Name":"xiaoyu","Age":18,"Sex":1}

:::info 注意:如果结构体中的字段为小写字母开头,将不能被序列化,因为这相当于是一个局部属性 :::

如果想要输出的结果为小写字母开头的key,可以为结构体添加Tag

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
    Sex  int    `json:"sex"`
}

这样的话,就可以输出:

{"name":"xiaoyu","age":18,"sex":1}

二、序列化Map

func main() {
    person := make(map[string]interface{}) // value为interface{}表示值可以是多种类型
    person["name"] = "xiaoyu"
    person["age"] = 18
    person["sex"] = 1

    b, err := json.Marshal(person) // 将Map序列号为json字节数组
    if err != nil {
        fmt.Println(err.Error())
        return
    }
    fmt.Println(string(b)) // 将json字节数组转化为字符串
}

打印出:

{"age":18,"name":"xiaoyu","sex":1}

三、反序列化为结构体

使用 json.Unmarshal 将字节数组反序列化。

func main() {
    personStr := `{"name":"xiaoyu","age":18,"sex":1}`
    person := new(Person)
    err := json.Unmarshal([]byte(personStr), &person) // 将json字符串转化为byte数组,再填充到person
    if err != nil {
        fmt.Println(err.Error())
        return
    }
    fmt.Println(person)
    fmt.Println(person.Name)
}

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
    Sex  int    `json:"sex"`
}

打印出:

&{xiaoyu 18 1}
xiaoyu

:::info 注意:反序列化中json字符串的key也应该跟结构体的Tag对应 :::

四、反序列化为Map

func main() {
    personStr := `{"name":"xiaoyu","age":18,"sex":1}`
    person := make(map[string]interface{})
    err := json.Unmarshal([]byte(personStr), &person) // 将json字符串转化为byte数组,再填充到person
    if err != nil {
        fmt.Println(err.Error())
        return
    }
    fmt.Println(person)
    fmt.Println(person["name"])
}

打印出:

map[age:18 name:xiaoyu sex:1]
xiaoyu