为什么要序列化和反序列化
我们的数据对象要在网络中传输或保存到文件,就需要对其编码和解码动作,目前存在很多编码格式:json, XML, Gob, Google Protocol Buffer 等, Go 语言当然也支持所有这些编码格式。
序列化与反序列化定义
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。通过从存储区中读取对象的状态,重新创建该对象,则为反序列化
序列化和反序列化规则
Go类型 json 类型
bool booleans
float64 numbers
string strings
nil null
在解析 json 格式数据时,若以 interface{} 接收数据,需要按照以上规则进行解析。
代码演示
反序列化
package main import ( "encoding/json" "fmt" ) type People struct { name string `json:"name"` // name,小写不导出 Age int `json:"age"` // age Gender string `json:"gender"` // gender Lesson } type Lesson struct { Lessons []string `json:"lessons"` } func main() { jsonstr := `{"Age": 18,"name": "Jim" ,"gender": "男","lessons":["English","History"],"Room":201,"n":null,"b":false}` // 反序列化 var people People if err := json.Unmarshal([]byte(jsonstr),&people); err == nil { fmt.Println("struct people:") fmt.Println(people) } // 反序列化 json 字符串中的一部分 var lessons Lesson if err := json.Unmarshal([]byte(jsonstr),&lessons); err == nil { fmt.Println("struct lesson:") fmt.Println(lessons) } // 反序列化 json 字符串数组 jsonstr = `["English","History"]` var str []string if err := json.Unmarshal([]byte(jsonstr), &str); err == nil { fmt.Println("struct str:") fmt.Println(str) } } // 打印结果 struct people: { 18 男 {[English History]}} struct lesson: {[English History]} struct str: [English History]