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

问题描述:

我正在尝试使用USDA's Farmers Market Directory API来接收有关附近农夫市场所在位置的数据,并使用邮政编码。我存储在响应的解组体:如何解析从请求返回的JSONp?

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?

响应正文是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:你应该处理(或返回)你的错误,而不是只记录它们;记录它们仍然意味着你的函数继续处理未处理的错误。遇到无响应正文或JSON解组错误时,您的代码可能会恐慌。

+0

我指的是JavaScript示例以下例如: 'detailResultHandler( { “marketdetails”:{ “GoogleLink”:“http://maps.google.com/?q=38.881112%2C% 20-77.112179%20(%22Ballston + FRESHFARM + Market%22)“, ”地址“:”901N Taylor St,Ballston,Virginia,22203“, ”Schedule“:”June- October Thursday 3:00 PM to 7:00 PM“; } } };”烘焙食品;奶酪和/或乳制品;鸡蛋;新鲜水果和蔬菜;新鲜和/或干香草;蜂蜜; 虽然,我理解你的观点,并将使用两个结构“marketDetails”和里面的内容来重构它 –