序列化:通过某种方式把数据结构或对象写入到磁盘文件中或通过网络传到其他节点的过程。
反序列化:把磁盘中对象或者把网络节点中传输的数据恢复为Python的数据对象的过程。
1、json初识
序列化最重要的就是json序列化。
JSON(javascript Object Notation,JS对象标记)是一种轻量级的数据交互格式。它基于ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效的提升网络传输效率。
| Go语言数据类型 | json支持的类型 |
|---|---|
| 整型、浮点型 | 整型、浮点型 |
| 字符串(在双引号中) | 字符串(双引号) |
| 逻辑值(true 或 false) | 逻辑值(true 或 false) |
| 数组、切片 | 数组(在方括号中) |
| map | 对象(在花括号中) |
| nil | null |
2、结构体的json操作
package mainimport ("encoding/json""fmt")type Addr struct {Province stringCity string}type Stu struct {Name string `json:"name"`Age int `json:"-"`Addr}func main() {map01 := map[int]string{1: "111", 2: "222", 3: "333"}stu01 := Stu{"sgg", 22, Addr{"shanghai", "jiading"}}// 序列化MapBytes, _ := json.Marshal(map01) // 返回 []bytes,errorStuBytes, _ := json.Marshal(stu01)fmt.Println(string(MapBytes)) // 字节转换为字符fmt.Println(string(StuBytes)) // {"Name":"sgg","Age":22,"Province":"shanghai","City":"jiading"}// 反序列化// var x = make(map[int]string)var map02 map[int]stringjson.Unmarshal([]byte(MapBytes), &map02) // 如果不传地址,就是值cpoyfmt.Println(map02) //map[1:111 2:222 3:333]var stu02 Stujson.Unmarshal([]byte(StuBytes), &stu02)fmt.Println(stu02) // {sgg 22 {shanghai jiading}}}
- 序列化:json.Marshal 序列化成字节 -> string 方式转成字符
- 反序列化: 先定义要转成数据类型 -> json.Unmarshal 传入地址和字节 -> 转成go语言识别的数据类型。
3、序列化结构体字段是否可见
我们在定义的一个结构体的时候,如果成员变量是首字母是大写表示json反序列后可见,如果首字母小写,表示json反序列化不可见。
package mainimport ("encoding/json""fmt")type Stu struct {name string // 首字母小写不可见Age int // 首字母大写可见}func main() {stu01 := "{\"name\":\"sgg\",\"age\":22}"// 反序列化var stu02 Stujson.Unmarshal([]byte(stu01), &stu02)fmt.Println(stu02) // { 22}, 只见到age,没见到name}
那我如果想我的首字母大写,但是我的json序列化的时候也想见到小写,我可以加上json 标签
package mainimport ("encoding/json""fmt")type Stu struct {Name string `json:"name"` // 加上json 标签Age int `json:"-"` // 表示不参与序列化}func main() {stu01 := "{\"name\":\"sgg\",\"Age\":22}"// 反序列化var stu02 Stujson.Unmarshal([]byte(stu01), &stu02)fmt.Println(stu02) // {sgg 0}}
