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时,你也看到了这调用得有多么的玛法.


最后,不给个点赞么???


猜你喜欢

转载自blog.csdn.net/feiwutudou/article/details/80816184
今日推荐