如何解组从请求返回的JSONp?

时间:2016-04-24 00:57:28

标签: json api go jsonp

我尝试使用USDA's Farmers Market Directory API使用邮政编码接收有关附近农贸市场所在位置的数据。我将响应的unmarshalled体存储在:

type marketResponse struct {
        MapsLink string `json:"GoogleLink"`
        Address  string `json:"Address"`
        Schedule string `json:"Schedule"`
        Products string `json:"Products"`
}

使用代码:

//TODO: location: "http://search.ams.usda.gov/farmersmarkets/v1/data.svc/locSearch?lat=" + lat + "&lng=" + lng
resp, err := http.Get("http://search.ams.usda.gov/farmersmarkets/v1/data.svc/zipSearch?zip=" + zipcode)
if err != nil {
        log.Printf("Could net search zipcode %s: %v", zipcode, err)
}
defer func() {
        if err := resp.Body.Close(); err != nil {
                log.Println(err)
        }
}()

body, err := ioutil.ReadAll(resp.Body)
if err != nil {
        log.Println(err)
}

newMarket := &marketResponse{}
if err := json.Unmarshal(body, newMarket); err != nil {
        log.Println(err)
}

log.Println("response: " + newMarket.Address)

问题是,响应主体是JSONp,我在JSON中解组。如何使用外部包在JSONp中解组呢?

1 个答案:

答案 0 :(得分:2)

响应正文是JSON - 根据响应的Content-Type:application/json; charset=utf-8标题。

问题是您的marketResponse结构与返回的JSON没有关系。使用JSON-to-Go,您的结构应如下所示:

type MarketResponse struct {
    Results []Result `json:"results"`
}

type Result struct {
    ID string `json:"id"`
    Marketname string `json:"marketname"`
}

目前还不清楚现有的marketResponse结构在哪里适合,因为API端点都不会返回具有该结构的数据。

PS:您应该处理(或返回)您的错误,而不仅仅是记录它们;记录它们仍然意味着您的函数继续处理未处理的错误。然后,当遇到nil响应主体或JSON解组错误时,您的代码可能会发生混乱。