2016-04-24 4 views
2

USDA's Farmers Market Directory APIを使用して、近くの農家の市場がどこにあるかに関するデータを郵便番号で受け取ろうとしています。要求から返されたJSONpをアンマーシャリングする方法はありますか?

//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に非整列化しています:コードを使用して

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

:私は中に応答の整列化されて体を格納します。外部パッケージを使用してJSONpで非整列化するにはどうしたらいいですか?

答えて

2

応答本文は、応答のContent-Type:application/json; charset=utf-8ヘッダーに従ってJSONです。

あなたのmarketResponse構造体は、返されたJSONとは関係がありません。既存のmarketResponse構造体は、ここに収まるところもないAPIエンドポイントは、その構造のデータを返すように、それははっきりしていない

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

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

JSON-to-Goを使用して、あなたの構造体は次のようになります。

PS:エラーを処理(または返す)してください。それらをログに記録すると、関数が未処理のエラーで処理を続けることになります。あなたのコードは、応答ボディが無かったり、JSONのアンマーシャリングエラーが発生したときにパニックに陥ります。

+0

Iは、JavaScriptの例以下EXに言及した 'detailResultHandler( { "marketdetails":{ "GoogleLink":" http://maps.google.com/?q=38.881112%2C% "住所": "901 N Taylor St、バージニア州ボールストン、22203"、 "スケジュール": "6月〜10月木曜日午後3時から午後3時までの20-77.112179%20(%22Ballston + FRESHFARM +市場%22)食肉;家禽 "" } } ); "鶏肉、牛乳、鶏肉、 しかし、私はあなたのことを理解していますが、2つの構造体、 'marketDetails'と内部構造体 –

関連する問題