golang解析复杂的json对象
json解析早就接触过了,只不过是一直用在php里面,今天有机会在golang中解析json,确实颠覆了php的json_decode(json)函数.
好吧,今天我解析的汽车之家的接口,整个json数据用工具解析下来是这个样子:
好吧,这里面有对象有数组交替,先去分析一下这个json的组成,懂行的小伙伴一定要注意这里面"[]"和"{}"的区别:
我就是因为这小问题,解析了半天不出货,怪不得别人呀;
其实这时候解析这个json有两种做法:
1.定义type XXX struct{}结构体,一层层往下做,这里比较适合结简单,并且字段不多的json;
2.直接定义map[string]interface{},直接赋值,简单粗暴,但是后期的数据套取会写很多的map[string]interface{})["XXX"];
好的,大概的思想有了,那么直接开干!!!
1.定义结构体
package main import ( "net/http" _ "github.com/go-sql-driver/mysql" "io/ioutil" "encoding/json" "fmt" ) //处理错误函数 func checkErrs(err error) { if err != nil { panic(err) } } type Jsons struct { Message string `json:"message"` Result Result `json:"result"` } type Result struct { A []Brand `json:"A"` B []Brand `json:"B"` C []Brand `json:"C"` D []Brand `json:"D"` } type Brand struct { Id string `json:"id"` Name string `json:"name"` Bfirstletter string `json:"bfirstletter"` Logo string `json:"logo"` } func brands() { //读取Api数据 resp, err := http.Get("https://j.autohome.com.cn/pcplatform/common/getBrandInfo") if err != nil { panic(err) } data, err := ioutil.ReadAll(resp.Body) //json转化成map b := Jsons{} json.Unmarshal([]byte(data), &b) fmt.Println(b) } func main() { brands() }
这里需要说明的是,在结构体Result中,由于原json数据是一个A-Z的集合,所以如果要全部解析的话,理论上是要从A写到Z的,对于我们这个懒死不想怼代码的菜鸟来说,就有了interface{}方法
2.定义map
package main import ( "net/http" _ "github.com/go-sql-driver/mysql" "io/ioutil" "encoding/json" "fmt" ) //处理错误函数 func checkErrs(err error) { if err != nil { panic(err) } } func brands() { //读取Api数据 resp, err := http.Get("https://j.autohome.com.cn/pcplatform/common/getBrandInfo") if err != nil { panic(err) } data, err := ioutil.ReadAll(resp.Body) //json转化成map m := make(map[string]interface{}) json.Unmarshal([]byte(data), &m) fmt.Println(m["result"].(map[string]interface{})["A"].([]interface{})[3].(map[string]interface{})["name"]) } func main() { brands() }
虽然不需要使用结构体一个个的去定义,但是代码最后要调用json中result集合A下的第4(slice是从零开始的)条数据的name时,你也看到了这调用得有多么的玛法.
最后,不给个点赞么???