我正在尝试用golang咬牙,并认为从rest api解析一些json是一个好用例。它看起来就像定义一个结构并将api响应解组到其中一样简单。
很自然地,我正在使用的api响应并不是一个很好的选择。我在玩craigslist jsonsearch-响应是2个对象的数组。第一个对象是结果数组,第二个对象是杂项。元数据。
[
[
{
"Ask":6000,
"CategoryID":145,
"ImageThumb":"https:\/\/images.craigslist.org\/01212_dZ9PfxSmjEH_50x50c.jpg",
"Latitude":39.591784,
"Longitude":-105.083209,
"PostedDate":1533949799,
"PostingID":6642987803,
"PostingTitle":"1991 Jeep Wrangler YJ 4.0 4X4 $6000 OBO",
"PostingURL":"https:\/\/denver.craigslist.org\/cto\/d\/1991-jeep-wrangler-yj-40-4xobo\/6642987803.html"
}
],
{
"NonGeocoded":2,
"baseurl":"\/\/denver.craigslist.org",
"clat":41.2077284889441,
"clng":-101.993919320865,
"clustered":0,
"geocoded":118,
"zoom":7
}
]
这些对象都不具有键的事实是我迷路的地方。
我创建了一个结构,我认为该结构可以映射到此响应。没有作为领域标签的键,我迷路了……如果只有某种方式说响应中的第一个元素应该将Results []结构映射到第二个元素,然后映射到Metadata结构。
type SearchResponse struct {
Results []struct {
Ask int
CategoryID int
ImageThumb string
Latitude float32
Longitude float32
PostedDate int64
PostingID int64
PostingTitle string
PostingURL string
}`json:"??first element??"`
Metadata struct{
NonGeocoded int
baseurl string
clat float32
clng float32
clustered int
geocoded int
zoom int
}`json:"??second element??"`
}
func main() {
searchUrl := "https://denver.craigslist.org/jsonsearch/cta?query=jeep+wrangler&sort=rel&max_price=15000&auto_transmission=1"
resp, _ := http.Get(searchUrl)
bytes, _ := ioutil.ReadAll(resp.Body)
var searchResp SearchResponse
if err := json.Unmarshal(bytes, &searchResp); err != nil {
panic(err)
}
fmt.Print("it worked!")
resp.Body.Close()
}
有没有更简单/更好的方法?
答案 0 :(得分:1)
只需使用这个https://github.com/Anderson-Lu/gofasion。很简单。
Gofasion是一个轻量级的解析库,可在开发过程中简化接口JSON数据的解析。其最大的特点是支持链式调用,这意味着可以直接获取目标键名称和键值,而无需预先定义数据的结构。