go JSON解析 JSON编码

编码


定义一个结构体用来放需要进行JSON编码的数据,结构体的字段名必须是大写开头的可导出字段,否则在解析时会解析不出来

使用json.Marshal(v interface{}) ([]byte, error)进行JSON编码

    type Userinfo struct {
        Id       int `json:"id"`
        Username string `json:"username"`
    }
    u := &Userinfo{}
    u.Id = 1
    u.Username = "lauwen"
    j, err := json.Marshal(u)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(string(j))

上述代码输出:

{"id":1,"username":"lauwen"}

解析


使用json.Unmarshal(data []byte, v interface{}) error来进行JSON数据的解析,可以看出第一个参数是[]byte类型数据,所以在使用时需要将字符串类型的JSON数据转换为[]byte类型。
  • 以下使用的解析的JSON字符串都由上一步编码而来,为[]byte类型,无需再转类型。
  • 使用的结构体类型也是上面编码时使用到的结构体,不做重复定义。

JSON解析为结构体

已知JSON结构的时候,可以定义一个结构体来存放JSON解析出来的数据

    var ui Userinfo
    err = json.Unmarshal(j, &ui)
    fmt.Println(ui)

以上代码输出:

{1 lauwen}

JSON解析为map

不清楚JSON数据结构时,可以使用map的来存放JSON解析出来的数据;如下,首先定义了一个map类型数据来接收解析后的JSON数据

    var dj map [string] interface{}
    err = json.Unmarshal(j, &dj)
    fmt.Println(dj)

以上代码输出:

map[id:1 username:lauwen]

完整代码


package main
 
import (
    "encoding/json"
    "fmt"
)
 
func main() {
    type Userinfo struct {
        Id       int `json:"id"`
        Username string `json:"username"`
    }
    u := &Userinfo{}
    u.Id = 1
    u.Username = "lauwen"
    j, err := json.Marshal(u)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(string(j))
 
    var ui Userinfo
    err = json.Unmarshal(j, &ui)
    fmt.Println(ui)
 
    var dj map [string] interface{}
    err = json.Unmarshal(j, &dj)
    fmt.Println(dj)
}