好吧,今天我解析的汽车之家的接口,整个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时,你也看到了这调用得有多么的玛法.