go语言之进阶篇json解析到结构体

/ go / 没有评论 / 3444浏览

go语言之进阶篇json解析到结构体

1、json解析到结构体

示例:

package main

import (
    "encoding/json"
    "fmt"
)

type IT struct {
    Company  string   `json:"company"`
    Subjects []string `json:"subjects"` //二次编码
    IsOk     bool     `json:"isok"`
    Price    float64  `json:"price"`
}

func main() {

    jsonBuf := `
    {
    "company": "itcast",
    "subjects": [
        "Go",
        "C++",
        "Python",
        "Test"
    ],
    "isok": true,
    "price": 666.666
}`

    var tmp IT                                   //定义一个结构体变量
    err := json.Unmarshal([]byte(jsonBuf), &tmp) //第二个参数要地址传递
    if err != nil {
        fmt.Println("err = ", err)
        return
    }
    //fmt.Println("tmp = ", tmp)
    fmt.Printf("tmp = %+v\n", tmp)
}

执行结果:

tmp = {Company:itcast Subjects:[Go C++ Python Test] IsOk:true Price:666.666}

示例2: 定义结构体,解析你想生成的字段

package main

import (
    "encoding/json"
    "fmt"
)

type IT struct {
    Company  string   `json:"company"`
    Subjects []string `json:"subjects"` //二次编码
    IsOk     bool     `json:"isok"`
    Price    float64  `json:"price"`
}

func main() {

    jsonBuf := `
    {
    "company": "itcast",
    "subjects": [
        "Go",
        "C++",
        "Python",
        "Test"
    ],
    "isok": true,
    "price": 666.666
}`

    var tmp IT                                   //定义一个结构体变量
    err := json.Unmarshal([]byte(jsonBuf), &tmp) //第二个参数要地址传递
    if err != nil {
        fmt.Println("err = ", err)
        return
    }

    type IT2 struct {
        Subjects []string `json:"subjects"` //二次编码
    }

    var tmp2 IT2
    err = json.Unmarshal([]byte(jsonBuf), &tmp2) //第二个参数要地址传递
    if err != nil {
        fmt.Println("err = ", err)
        return
    }
    fmt.Printf("tmp2 = %+v\n", tmp2)

}

执行结果:

tmp2 = {Subjects:[Go C++ Python Test]}

Go语言结构体转json的坑

json.Marshal()

JSON输出的时候必须注意,只有导出的字段(首字母是大写)才会被输出,如果修改字段名,那么就会发现什么都不会输出,所以必须通过struct tag定义来实现。

针对JSON的输出,我们在定义struct tag的时候需要注意的几点是:

代码示例

package main

import (
    "encoding/json"
    "fmt"
)

func main() {

    type UserInfo struct {
        Id int
        Name string
        Address string
    }

    type Comiket struct {
        id int
        title string
    }

    type Test struct {
        Id int `json:"-"`
        Content string `json:"content"`
        IsDel bool `json:",string"`
        Type int `json:"type, omitempty"`
    }

    c := Comiket{1, "AS动漫游戏嘉年华"}
    v, error := json.Marshal(c)
    fmt.Println(string(v))
    fmt.Println(error)
    fmt.Println("------------------")

    User := UserInfo{1, "taylor", "USA"}
    b, err := json.Marshal(User)
    fmt.Println(string(b))
    fmt.Println(err)
    fmt.Println("------------------")

    t := Test{Id:1, Content:"hello world", IsDel:true}
    val, _ := json.Marshal(t)
    fmt.Println(string(val))
}

1