序列化-结构序列化
序列化
在前面讲解json用途时,我们有介绍到,数据在网络传输前后要进行序列化和反序列化。目的是将复杂的数据类型按照统一、简单且高效的形式转储,以达到网络传输的目的。
在go语言中,较为复杂的数据存储形式无外乎结构体、map、切片。因此这里我们以这三种数据类型序列化为例进行讲解。其他简单数据类型请同学们融会贯通,自主学习。
所谓“序列化”(Serialize),简单理解就是将 结构体、map、切片 这三种类型的数据相应的转换为json字符串的过程。
结构体序列化
首先,创建结构体类型。由于之后要对该结构体进行序列化,而序列化函数是在 encoding/json包中,因此内部字段应指定为首字母大写,以便导出作用域。
type Student struct {
Name string
Id int
Age int
Addr string
}
序列化函数:
import "encoding/json"
func Marshal(v interface{}) ([]byte, error)
参数:空接口类型。意味着任何数据类型(int、float、结构体…)都可以使用该函数进行序列化。
返回值:字符切片,err
示例代码:
import (
"encoding/json"
"fmt"
)
// 定义结构体
type Student struct {
Name string
Id int
Age int
Addr string
}
// 封装结构体序列化测试函数
func structSerial() {
// 定义结构体变量
stu := Student{
Name:"瞎么海",
Id:110,
Age:33,
Addr:"天津市海河",
}
// 使用 encoding/json 包中的 Marshal() 函数将结构体变量进行序列化
data, err := json.Marshal(&stu)
if err != nil {
fmt.Println("Marshal err:", err)
return
}
// 查看序列化后的 json 字符串
fmt.Println("stu序列化后 = ", string(data))
}
func main() {
// 测试结构体序列化
structSerial()
}
输出结果为:
stu序列化后 = {"Name":"瞎么海","Id":110,"Age":33,"Addr":"天津市海河"}
Go 语言标准库的"encoding/json"包还提供了另外一个方法:MarshalIndent。该方法的作用与Marshall作用相同,只是可以通过方法参数,设置前缀、缩进等,对Json 多了一些格式处理,打印出来比较好看。如:
json.MarshalIndent(stu, "\t", "")
直接使用fmt.Println打印,能换行显示 stu的成员并带有 \t 缩进对齐效果。