理解 Go 中的 JSON
JSON 是一种轻量级的数据交换格式,常用作前后端数据交换,Go 在 encoding/json 包中提供了对 JSON 的支持。
序列化
把 Go struct 序列化成 JSON 对象,Go 提供了 Marshal 方法,正如其含义所示表示编排序列化,函数签名如下:
func Marshal(v interface{
}) ([]byte, error)
举例来说,比如下面的 Go struct:
type Message struct {
Name string
Body string
Time int64
}
使用 Marshal 序列化:
m := Message{
"Alice", "Hello", 1294706395881547000}
b, err := json.Marshal(m)
fmt.Println(b) //{"Name":"Alice","Body":"Hello","Time":1294706395881547000}
在 Go 中并不是所有的类型都能进行序列化:
- JSON object key 只支持 string
- Channel、complex、function 等 type 无法进行序列化
- 数据中如果存在循环引用,则不能进行序列化,因为序列化时会进行递归
- Pointer 序列化之后是其指向的值或者是 nil
还需要注意的是:只有 struct 中支持导出的 field 才能被 JSON package 序列化,即首字母大写的 field。
反序列化
反序列化函数是 Unmarshal ,其函数签名如下:
func Unmarshal(data []byte, v interface{
}) error
如果要进行反序列化,我们首先需要创建一个可以接受序列化数据的 Go struct:
var m Message
err := json.Unmarshal(b, &m)
JSON 对象一般都是小写表示,Marshal 之后 JSON 对象的首字母依然是大写,如果序列化之后名称想要改变如何实现,答案就是 struct tags。
Struct Tag
Struct tag 可以决定 Marshal 和 Unmarshal 函数如何序列化和反序列化数据。
指定 JSON filed name
JSON object 中的 name 一般都是小写,我们可以通过 str