Golang序列化就是把结构体对象转变成Json数据,反序列化就是把Json数据转换成结构体对象。
关于JSON数据,结构体与JSON序列化,结构体标签,嵌套结构体和JSON序列化。
一 关于JSON数据 JSON(JavaScript Object Notation,JS对象标记),一种轻量级的数据交换格式。RESTful API 接口中返回的数据都是JSON数据。
二 结构体与JSON序列化 Golang要给app或者小程序提供api接口数据,就需要涉及结构体和json之间的转换。
1 2 序列化使用 json.marshal(interface {}) ([]byte , error ) 反序列化使用 json.unmarshal([]byte , interface {}) (error )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import "encoding/json" type Student struct { Id string Age int Name string sex string } func main () { stu := Student{ Id: "123" , Age: 12 , Name: "luyiz" , sex: "女" , } bytes, _ := json.Marshal(stu) str := string (bytes) fmt.Println(str) }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 type Student struct { Id string Age int Name string sex string } func main () { str := `{"Id":"123","Age":12,"Name":"luyiz"}` bytes := []byte (str) stu := Student{} _ = json.Unmarshal(bytes, &stu) fmt.Printf("type: %T, data: %v" , stu, stu) }
三 结构体标签Tag Tag是结构体的元信息,可以在运行的时候通过反射的机制读取出来。
为结构体编写Tag时,严格遵守键值对的队则。结构体标签的解析容错能力很差,一旦格式错了,编译和运行都不会报错。
不要再key和value之间添加空格。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 type Student struct { Id string `json:"id"` Age int `json:"age"` Name string `json:"name"` sex string `json:"sex"` } func main () { stu := Student{ Id: "123" , Age: 12 , Name: "luyiz" , sex: "女" , } bytes, _ := json.Marshal(stu) str := string (bytes) fmt.Println(str) }
四 嵌套结构体和JSON序列化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 type Student struct { Id string `json:"id"` Age int `json:"age"` Name string `json:"name"` } type Class struct { Title string Member []Student `json:"member"` } func main () { stu1 := Student{ Id: "123" , Age: 12 , Name: "luyiz" , } stu2 := Student{ Id: "122" , Age: 13 , Name: "a123" , } member := make ([]Student, 0 ) member = append (member, stu1) member = append (member, stu2) class := Class{ Title: "1班" , Member: member, } bytes, _ := json.Marshal(class) str := string (bytes) fmt.Println(str) }