18 Golang结构体详解(四)

结构体和Json相互转换

当Golang要为App或者小程序提供Api接口数据时,涉及到结构体和Json之间的相互转换

Golang序列化是指把结构体数据转换成Json格式的字符串;Golang Json的反序列化是指把Json数据转化成Golang中的结构体对象

Golang中的序列化和反序列化主要通过"encoding/json"包中的json.Marshal()和json.Unmarsual()

  • 序列化

结构体中私有属性不能被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)
    //main.Student{Id:12, Gender:"男", Name:"李四", Sno:"s001"}
    jsonByte, _ := json.Marshal(s1)
    jsonStr := string(jsonByte)
    fmt.Printf("%v", jsonStr)
    //{"Id":12,"Gender":"男","Name":"李四","Sno":"s001"}
}
  • 反序列化
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"}
    //李四
}
  • 嵌套结构体的序列化
type Student struct {
    Id int
    Gender string
    Name string
}

type Class struct {
    Title string
    Students []Student
}

func main(){
    c := Class {
        Title : "01班",
        Students : make([]Student, 0),
    }
    for i := 1; i <= 10; i++ {
        s := Student {
            Id:i,
            Gender:"男",
            Name:fmt.Sprintf("stu_%v", i),
        }
        c.Students = append(c.Students, s)
    }
    fmt.Println(c)
    //{01班 [{1 男 stu_1} {2 男 stu_2} {3 男 stu_3} {4 男 stu_4} 
    //{5 男 stu_5} {6 男 stu_6} {7 男 stu_7} {8 男 stu_8}
    //{9 男 stu_9} {10 男 stu_10}]}
    strByte, err := json.Marshal(c)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(string(strByte))      
    }
    //{"Title":"01班","Students":[{"Id":1,"Gender":"男","Name":"stu_1"},
    //{"Id":2,"Gender":"男","Name":"stu_2"},……,{"Id":10,"Gender":"男","Name":"stu_10"}]}
}
  • 嵌套结构体的反序列化

type Student struct {
    Id int 
    Gender string
    Name string
}

type Class struct {
    Title string
    Students []Student
}

func main() {
    str := `{"Title":"01班","Students":[{"Id":1,"Gender":"男","Name":"stu_1"},{"Id":2,"Gender":"男","Name":"stu_2"},{"Id":3,"Gender":"男","Name":"stu_3"},{"Id":4,"Gender":"男","Name":"stu_4"},{"Id":5,"Gender":"男","Name":"stu_5"},{"Id":6,"Gender":"男","Name":"stu_6"},{"Id":7,"Gender":"男","Name":"stu_7"},{"Id":8,"Gender":"男","Name":"stu_8"},{"Id":9,"Gender":"男","Name":"stu_9"},{"Id":10,"Gender":"男","Name":"stu_10"}]}`
    
    var c = &Class{}
    err := json.Unmarshal([]byte(str),c)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Printf("%#v\n", c)
        fmt.Printf("%v", c.Title)
    }
    // &main.Class{Title:"01班", Students:[]main.Student{main.Student{Id:1, Gender:"男", Name:"stu_1"}, main.Student{Id:2, Gender:"男", Name:"stu_2"}, main.Student{Id:3, Gender:"男", Name:"stu_3"}, main.Student{Id:4, Gender:"男", Name:"stu_4"}, main.Student{Id:5, Gender:"男", Name:"stu_5"}, main.Student{Id:6, Gender:"男", Name:"stu_6"}, main.Student{Id:7, Gender:"男", Name:"stu_7"}, main.Student{Id:8, Gender:"男", Name:"stu_8"}, main.Student{Id:9, Gender:"男", Name:"stu_9"}, main.Student{Id:10, Gender:"男", Name:"stu_10"}}}
    //01班
}
结构体标签Tag

通过指定tag实现json序列化该字段时的key

type Student struct {
    Id int `json:"id"`
    Gender string `json:"gender"`
    Name string `json:"name"`
    Sno string `json:"no"`
}

func main (){
    var s1 = Student {
        Id : 12,
        Gender :"男",
        Name : "李四",
        Sno : "s001",
    }
    jsonByte, _ := json.Marshal(s1)
    jsonStr := string(jsonByte)
    fmt.Printf("%v", jsonStr)
    //{"id":12,"gender":"男","name":"李四","no":"s001"}
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    余生动听阅读 10,803评论 0 11
  • 彩排完,天已黑
    刘凯书法阅读 4,458评论 1 3
  • 没事就多看看书,因为腹有诗书气自华,读书万卷始通神。没事就多出去旅游,别因为没钱而找借口,因为只要你省吃俭用,来...
    向阳之心阅读 4,970评论 3 11
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 129,477评论 2 7

友情链接更多精彩内容