课程名称:GO开发工程师
课程章节:8-2: json数据格式的处理;8-3第三方API数据格式的解析技巧
课程讲师: ccmouse
课程内容:
1.序列化
// 序列化
func marshal() {
o := Order{
ID: "1234",
Quantity: 3,
TotalPrice: 30,
Item: []OrderItem{
{
ID: "item_1",
Name: "learn go",
Price: 10,
},
{
ID: "item_2",
Name: "interview",
Price: 5,
},
},
}
b, err := json.Marshal(o)
if err != nil {
panic(err)
}
fmt.Printf("%s\n\n", b)
}
- 反序列化
// 反序列化
func unmarshal() {
s := `{"id":"1234","Item":[{"id":"item_1","name":"learn go","price":10},{"id":"item_2"
,"name":"interview","price":5}],"quantity":3,"totalPrice":30}
`
var o Order
err := json.Unmarshal([]byte(s), &o) // 将序列化的值传给o
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", o)
}
- 第三方json解析技巧
func parseNLP() {
res := `{
"data": [
{
"synonym": "",
"weight": "0.6",
"word": "真丝",
"tag": "材质"
},
{
"synonym": "",
"weight": "0.8",
"word": "韩都衣舍",
"tag": "品牌"
},
{
"synonym": "连身裙,联衣裙",
"weight": "1.0",
"word": "连衣裙",
"tag": "品类"
}
]
}`
//方式一:使用map定义json结构
// json 的key是string,值是不定的(string、int、struct...)
m := make(map[string]interface{})
err := json.Unmarshal([]byte(res), &m)
if err != nil {
panic(err)
}
//fmt.Printf("%+v\n", m)
// 使用 type assertion 告知类型,取值不方便
fmt.Printf("%+v\n", m["data"].([]interface{})[2].(map[string]interface{})["synonym"])
// 方式二: 使用结构体定义
m2 := struct {
Data []struct {
Synonym string `json:"synonym"`
} `json:"data"` // 注意要加上data的tag
}{}
err2 := json.Unmarshal([]byte(res), &m2)
if err2 != nil {
panic(err2)
}
fmt.Printf("%+v\n", m2.Data[2].Synonym)
}
课程收获:
- 遵循通用json传输格式,给struct加tag,表示json的key
- 在取值时使用struct定义json结构比map更便捷