美文网首页
Go 学习笔记 09 | Golang 结构体与 JSON 互相

Go 学习笔记 09 | Golang 结构体与 JSON 互相

作者: Wonz | 来源:发表于2020-12-06 18:20 被阅读0次

    一、Golang 结构体与 JSON 互相转换

    JSON 是一种轻量级的数据交换格式。RESTful API 接口中返回的数据都是 JSON 数据。

    JSON 基本格式:

    {
        key: value,
    }
    

    结构体转 JSON 举例

    package main
    
    import (
        "fmt"
        "encoding/json"
    )
    
    type Student struct {
        ID     int
        Gender string
        Name   string
        Sno    string
    }
    
    func main() {
        var s1 = Student{
            ID:     12,
            Gender: "男",
            Name:   "李四",
            Sno:    "s001",
        }
        fmt.Printf("%#v\n", s1)
    
        jsonByte, _ := json.Marshal(s1)
        jsonStr := string(jsonByte)
        fmt.Printf("%v", jsonStr)
    }
    

    输出:

    main.Student{ID:12, Gender:"男", Name:"李四", Sno:"s001"}
    {"ID":12,"Gender":"男","Name":"李四","Sno":"s001"}
    

    JSON 转结构体举例

    package main
    
    import (
        "fmt"
        "encoding/json"
    )
    
    type Student struct {
        ID     int
        Gender string
        Name   string
        Sno    string
    }
    
    func main() {
        var str = `{"ID":12,"Gender":"男","Name":"李四","Sno":"s001"}`  // 使用反引号 ` 可以方便在多个引号 " 下不需要使用转义符号来表示其他引号 "
        var s1 Student
        err := json.Unmarshal([]byte(str), &s1)
    
        if err != nil {
            fmt.Println(err)
        }
        fmt.Printf("%#v\n", s1)
        fmt.Println(s1.Name)
    }
    

    输出:

    main.Student{ID:12, Gender:"男", Name:"李四", Sno:"s001"}
    李四
    

    私有属性不能被 JSON 包访问

    package main
    
    import (
        "fmt"
        "encoding/json"
    )
    
    type Student struct {
        ID     int
        Gender string
        name   string  // 私有属性不能被 JSON 包访问
        Sno    string
    }
    
    func main() {
        var s1 = Student{
            ID:     12,
            Gender: "男",
            name:   "李四",
            Sno:    "s001",
        }
        fmt.Printf("%#v\n", s1)
    
        jsonByte, _ := json.Marshal(s1)
        jsonStr := string(jsonByte)
        fmt.Printf("%v", jsonStr)
    }
    

    输出:

    main.Student{ID:12, Gender:"男", name:"李四", Sno:"s001"}
    {"ID":12,"Gender":"男","Sno":"s001"}
    

    二、结构体标签

    package main
    
    import (
        "fmt"
        "encoding/json"
    )
    
    type Student struct {
        Id     int `json:"id"`  // 通过 tag 指定转换成的 json 字符串的 key
        Gender string `json:"gender"`
        name   string `json:"name"`
        Sno    string `json:"sno"`
    }
    
    func main() {
        var s1 = Student{
            Id:     12,
            Gender: "男",
            name:   "李四",
            Sno:    "s001",
        }
        fmt.Printf("%#v\n", s1)
    
        jsonByte, _ := json.Marshal(s1)
        jsonStr := string(jsonByte)
        fmt.Printf("%v", jsonStr)
    }
    

    输出:

    main.Student{Id:12, Gender:"男", name:"李四", Sno:"s001"}
    {"id":12,"gender":"男","sno":"s001"}
    

    Golang JSON 序列化:把结构体数据转化成 JSON 格式的字符串。

    Golang JSON 反序列化:把 JSON 数据转化成 Golang 中的结构体对象。

    三、参考教程

    Golang 教程 P34

    相关文章

      网友评论

          本文标题:Go 学习笔记 09 | Golang 结构体与 JSON 互相

          本文链接:https://www.haomeiwen.com/subject/eweuiktx.html