序列化-结构序列化

未匹配的标注

序列化

在前面讲解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 缩进对齐效果。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~