摘要2:Go的json解析:Marshal与Unmarshal_滢光点点-CSDN博客_json.marshal
encoding/json包
encoding/json
是官方提供的标准json, 实现RFC 7159中定义的JSON编码和解码。使用的时候需要预定义struct
,原理是通过reflection
和interface
来完成工作, 性能低。
常用的接口:
func Marshal(v interface{}) ([]byte, error)
生成JSONfunc Unmarshal(data []byte, v interface{}) error
解析JSON到struct
示例1 序列化:
type ColorGroup struct {
ID int
Name string
Colors []string
}
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"]}
示例2 反序列化:
var jsonBlob = []byte(`[
{"Name": "Platypus", "Order": "Monotremata"},
{"Name": "Quoll", "Order": "Dasyuromorphia"}
]`)
type Animal struct {
Name string
Order string
}
var animals []Animal
err := json.Unmarshal(jsonBlob, &animals)
if err != nil {
fmt.Println("error:", err)
}
fmt.Printf("%+v", animals)
输出:
[{Name:Platypus Order:Monotremata} {Name:Quoll Order:Dasyuromorphia}]
示例3 序列化标签:
type ColorGroup struct {
ID int `json: id`
Name string `json: name`
Colors []string `json: colors`
}
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)
fmt.Println(string(b))
输出:
{"id":1,"name":"Reds","colors":["Crimson","Red","Ruby","Maroon"]}
示例4 序列化标签:
序列化时,通过标签,指定忽略某个字段:`json:"-"`
注意:序列化操作中,不能序列化chan类型数据,否则报错
type ColorGroup struct {
ID int `json: id`
Name string `json: name`
Colors []string `json: colors`
Data <-chan bool `json:"-"` // 序列化时忽略该字段,定义一个只能接收的chan
Data1 chan *Class `json:"-"` // 定义chan
}
var (
Class chan bool
)
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)
fmt.Println(string(b))
输出:
{"id":1,"name":"Reds","colors":["Crimson","Red","Ruby","Maroon"]}