在go语言开发中,经常会遇到web前端传递过来的json数据,也会遇到请求第三方,第三方返回的是json数据。那么go语言中如何解析json呢?下面我们来演示一下。
一、解析单层json
解析单层json的话比较简单,一般我们使用对象来进行解析接收,示例代码如下:
package main import ( "encoding/json" "fmt" ) func main() { jsonb := "{\"school_id\":1,\"school_name\":\"北京市第一中学\"}" school := &School{} err := json.Unmarshal([]byte(jsonb), &school) if err != nil { panic(err) } fmt.Println(fmt.Sprintf("解析到的json是:%+v", school)) } type School struct { Id int `json:"school_id"` Name string `json:"school_name"` }
运行之后,可看到json被正确解析了:
备注:
1、上诉我们解析的json里面每个字段都是固定的类型,但是遇到一些不确定类型的,例如:
{ "code": 200, "msg": "请求成功", "data": any }
上面的json是我们经常在web中返回给前端的,data字段可能是string,也可能是数组,也可能是字典。所以像这种不确定的信息,我们就不能用struct对象来进行解析了,此时直接使用map解析即可,示例如下:
data := make(map[string]interface{}) err := json.Unmarshal([]byte(jsonb), &data)
二、解析嵌套json
除了单层json之外,还会涉及到嵌套的json,像嵌套的json的话,我们解析方式是一样的,主要是使用struct的对象里面的属性再嵌套对象即可,示例如下:
package main import ( "encoding/json" "fmt" ) func main() { jsonb := "{\"school_id\":1,\"school_name\":\"第一中学\",\"classdata\":{\"class_id\":1,\"class_name\":\"一班\"}}" school := &School{} err := json.Unmarshal([]byte(jsonb), &school) if err != nil { panic(err) } fmt.Println(fmt.Sprintf("解析到的json是:%+v", school)) } type School struct { Id int `json:"school_id"` Name string `json:"school_name"` Classdata ClassInfo `json:"classdata"` } type ClassInfo struct { Id int `json:"class_id"` Name string `json:"class_name"` }
最后输出下结果:
可以看到成功的解析了数据。
上面嵌套的json,我们演示的是嵌套的对象,但是除了嵌套的对象还有数组类型的,下面也演示下:
package main import ( "encoding/json" "fmt" ) func main() { jsonb := "{\"school_id\":1,\"school_name\":\"第一中学\",\"classdata\":[{\"class_id\":1,\"class_name\":\"一班\"}]}" school := &School{} err := json.Unmarshal([]byte(jsonb), &school) if err != nil { panic(err) } fmt.Println(fmt.Sprintf("解析到的json是:%+v", school)) } type School struct { Id int `json:"school_id"` Name string `json:"school_name"` Classdata []ClassInfo `json:"classdata"` } type ClassInfo struct { Id int `json:"class_id"` Name string `json:"class_name"` }
只需要指定json嵌套的对象为数组即可,即添加[]即可
是不是很简单?
以上就是go语言中解析json的案例。
还没有评论,来说两句吧...