Encoding - Marshal 序列化
在 Go 中並不是所有的類型都能進行序列化:
- 必須是 struct 中支援外部引用的 field 才能夠序列化 (即開頭字母大寫的 field)
- JSON object key 只支援 string
- Channel、complex、function 等 type 無法進行序列化
- 不支援循環數據結構,因為序列化時會進行無限迴圈
Pointer序列化之後是其指向的值或者是nil
指定 JSON filed name
Struct Tag
Struct tag 可以決定 Marshal 和 Unmarshal 函式如何序列化和反序列化數據。- 一般
json都是小寫,但因為 golang 序列化時,struct 必須是大寫,因此透過Struct Tag改成小寫 - mongodb 則是使用
bson,可以在 struct 加上json:"name,omitempty" bson:"name,omitempty"
指定 field 的行為
omitempty
透過
omitempty 如果 field 的值是對應類型的 zero-value,序列化之後的 JSON object 中不包含此 field-
透過
- 可以忽略掉該 fieldDecoding - Unmarshal 反序列化
預設的 JSON 支援以下幾種 Go 類型:
知道類型的反序列化
不知道類型的反序列化
如果不知道類型可以用
interface{}
回傳的格式如
key 是
string,value 是 interface{},必須透過 type assertion 和 range 取得所有的 keyReference Types - 反序列化對 slice、map、pointer 的處理
struct 中包含一個
slice Cars ,slice 預設是 nil,之所以反序列化可以正常進行就是因為 Unmarshal 在序列化時進行了對 slice Cars 做了初始化,同理,對 map 和 pointer 都會做類似的工作比如序列化如果 Pointer 不是 nil 首先進行 dereference 獲得其指向的值,然後再進行序列化,反序列化時首先對 nil pointer 進行初始化
nested struct 的序列化
Go 支援對
nested struct 進行序列化和反序列化:Stream JSON
Golang 提供
Decoder 和 Encoder 對 stream JSON 進行處理,常見 request 中的 Body、文件等
參考文件






