Encode
將一個對象編碼成 JSON 數據,接受一個 interface{} 對象,返回 []byte 和 err
func Marshal(v interface{}) {[]byte,err}
Marshal 函數將會遞歸遍歷整個對象,依次按照成員類型對這個對象進行編碼,類型轉換如下:
1 bool 類型轉換成 JSON 的 boolean
2 整數、浮點數等數值類型轉換成 JSON 的 Number
3 string 轉換成 JSON 的字符串(帶 "" 號)
4 struct 轉換成 JSON 的 Object ,再根據各個成員的類型遞歸打包
5 數組或切片轉換成 JSON 的 Array
6 []byte 會先進行 base64 編碼然后轉換成 JSON 字符串
7 map 轉換成 JSON 的 Object ,key 必須是 string
8 interface{} 按照內部的實際類型進行轉換
9 channel、func等類型,會返回 UnsupportedTypeError
如下示例:
package main
import (
"encoding/json"
"fmt"
"os"
)
// 定義一個結構體
type ColorGroup struct {
ID int
Name string
Colors []string
}
func main() {
group := ColorGroup{
ID : 1,
Name : "Reds",
Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},
}
b,err := json.Marshal(group)
if err != nil{
fmt.Println("error:",err)
}
os.Stdout.Write(b)
}
----------------------------------------------------------------------------
輸出結果:
{"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]}
Decode
將 JSON 數據解碼
func Unmarshal(data []byte,v interface{}) error
類型轉換規則和上面的規則類似,如下示例:
package main
import (
"encoding/json"
"fmt"
)
// func UnMarshal(data []byte,v interface{}) error
type Animal struct {
Name string
Order string
}
func main() {
var animals []Animal
jsonBlob := `[
{"Name" : "Platypus","Order" : "Monotremata"},
{"Name": "Quoll", "Order": "Dasyuromorphia"}
]`
err := json.Unmarshal([]byte(jsonBlob),&animals)
if err != nil {
fmt.Println("error:",err)
}
fmt.Println(animals)
}
------------------------------------------------------------------
輸出結果:
[{Platypus Monotremata} {Quoll Dasyuromorphia}]
