Golang的序列化-JSON篇
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.序列化概述
1>.什么是序列化
数据在网络传输前后要进行序列化和反序列化。目的是将复杂的数据类型按照统一、简单且高效的形式转储,以达到网络传输的目的。
除了在网络传输,有的数据存储到本地也是为了其它语言使用方便,通常也会使用相对来说较为通用的数据格式来存储,这就是我们常说的序列化,反序列化就是将数据按照规定的语法格式进行解析的过程。
2>.什么是JSON
JSON采用完全独立于语言的文本格式,但是也使用了类似于 C 语言家族的习惯(包括 C、C++、C#、Java、JavaScript、Perl、Python、go等)。这些特性使JSON成为理想的数据交换语言。
易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。目前,json已经成为主流的数据格式。
JSON的特性:
a).JSON解析器和JSON库支持许多不同的编程语言。
b).JSON文本格式在语法上与创建JavaScript对象的代码相同。由于这种相似性,无需解析器,JavaScript程序能够使用内建的eval()函数,用JSON数据来生成原生的JavaScript对象。
c).JSON 是存储和交换文本信息的语法。比 XML 更小、更快,更易解析。
d).JSON 具有自我描述性,语法简洁,易于理解。
e).JSON数据主要有两种数据结构,一种是键/值,另一种是数组的形式来表示。
博主推荐阅读:
http://www.json.org.cn/
二.JSON序列化案例
1>.结构体序列化
package main import ( "encoding/json" "fmt" ) /** 定义需要结构体 */ type Teacher struct { Name string ID int Age int Address string } func main() { s1 := Teacher{ Name: "Jason Yin", ID: 001, Age: 18, Address: "北京", } /** 使用“encoding/json”包的Marshal函数进行序列化操作,其函数签名如下所示: func Marshal(v interface{}) ([]byte, error) 以下是对Marshal函数参数相关说明: v: 该参数是空接口类型。意味着任何数据类型(int、float、map,结构体等)都可以使用该函数进行序列化。 返回值: 很明显返回值是字节切片和错误信息 */ //data, err := json.Marshal(&s1) /** Go语言标准库的"encoding/json"包还提供了另外一个方法:MarshalIndent。 该方法的作用与Marshall作用相同,只是可以通过方法参数,设置前缀、缩进等,对Json多了一些格式处理,打印出来比较好看。 */ data, err := json.MarshalIndent(s1, "\t", "") if err != nil { fmt.Println("序列化出错,错误原因: ", err) return } /** 查看序列化后的json字符串 */ fmt.Println("序列化之后的数据为: ", string(data)) }