公众号merlinsea
- 序列化和反序列化的介绍
- 序列化后得到的结果是一个json字符串
- 在go中序列化和反序列化结构体的时候,要求结构体的字段首字母大写+ 打上标签
- 序列化的类型和反序列化得到的类型必须要一样的才可以进行相互转换
- 可以将任意的类型序列化成json,比如slice序列化后盾结果是一个json数组,数组序列化后得到的是一个json数组,map序列化的结果是json的key-value形式,结构体序列化后的结果是json的key-value形式,通常序列化和反序列化的时候是将有key-value特征的类型进行序列化。
- 序列化结构体
package main import "fmt" import "encoding/json" // 后面的`json:"name"`在进行序列化和反序列化的时候会使用这个ley type Monster struct { Name string `json:"name"` // `json:"name"` 就是 struct tag Age int `json:"age"` Skill string `json:"skill"` } func main() { //1. 创建一个Monster变量 monster := Monster{"牛魔王", 500, "芭蕉扇~"} //2. 将monster变量序列化为 json格式字串 // json.Marshal 函数中使用反射 jsonStr, err := json.Marshal(monster) if err != nil { fmt.Println("json 处理错误 ", err) } //jsonStr {"name":"牛魔王","age":500,"skill":"芭蕉扇~"} fmt.Println("jsonStr", string(jsonStr)) monsterTmp := Monster{} // Unmarshal第一个类型是[]byte切片,第二个类型是地址 err = json.Unmarshal(jsonStr, &monsterTmp) if err != nil { fmt.Println("凡序列化失败") } else { //类型是 main.Monster,值是{牛魔王 500 芭蕉扇~} fmt.Printf("类型是 %T,值是%v \n", monsterTmp, monsterTmp) } }
- 序列化slice,slice中包含了多个map
import ( "encoding/json" "fmt" ) //将切片进行序列化 func marshalSlice() string { var slice []map[string]interface{} = make([]map[string]interface{}, 0) var m1 map[string]interface{} //使用map前,需要先make m1 = make(map[string]interface{}) m1["name"] = "jack" m1["age"] = "7" m1["address"] = "北京" slice = append(slice, m1) var m2 map[string]interface{} //使用map前,需要先make m2 = make(map[string]interface{}) m2["name"] = "tom" m2["age"] = "20" m2["address"] = [2]string{"墨西哥", "夏威夷"} slice = append(slice, m2) //将切片进行序列化操作 data, err := json.Marshal(slice) if err != nil { fmt.Printf("序列化错误 err=%v\n", err) } //输出序列化后的结果 return string(data) } //将序列化后的json凡序列化为切片 func unmarshalSlice(jsonStr string) []map[string]interface{} { //定义一个slice var slice []map[string]interface{} //反序列化,不需要make,因为make操作被封装到 Unmarshal函数 // 传递地址 err := json.Unmarshal([]byte(jsonStr), &slice) if err != nil { fmt.Printf("unmarshal err=%v\n", err) } return slice } func main() { var json = marshalSlice() //json = [{"address":"北京","age":"7","name":"jack"},{"address":["墨西哥","夏威夷"],"age":"20","name":"tom"}] fmt.Println("json = ", json) var slice = unmarshalSlice(json) // [map[address:北京 age:7 name:jack] map[address:[墨西哥 夏威夷] age:20 name:tom]] fmt.Println(slice) }