Goでhttpリクエスト(エンコード編)
前回、Goでhttpリクエストを送る - まさひちの道具箱でYOLP(地図サービス)の郵便番号検索APIを叩いた記事の続きです。
無事に叩くことはできたけど、出力結果が文字化けしていてモヤっとするので、その部分を直していきます。
httpリクエストの文字エンコード
前回は単純にリクエストパラメータとURLだけ設定してAPIを叩きました。
結果は
{"ResultInfo":{"Count":1,"Total":1,"Start":1,"Status":200,"Description":"","Copyright":"","Latency":0.015},"Feature":....
のようにJSON形式で返ってきたはずです。
この時、例えば
..."Name":"\u5ddd\u53e3\u5143\u90f7"...
のようにエンコードが間違っているのが気になりますよね。
これ、 文字化け解読ツール「もじばけらった」 で解析してみると、JSONエンコードにすると正しく見えるようです。
出力する文字コードを指定するにはjson.Marshalを使ってパースしてやればいいみたいです。
構造体の定義
JSON形式にパースするにはデータを入れるための構造体の定義が必要です。でも面倒なので、さっきAPI叩いて返ってきた結果をそのまま JSON-to-Go: Convert JSON to Go instantly に突っ込んで作ってもらいます。
type YOLP struct { ResultInfo struct { Count int `json:"Count"` Total int `json:"Total"` Start int `json:"Start"` Status int `json:"Status"` Description string `json:"Description"` Copyright string `json:"Copyright"` Latency float64 `json:"Latency"` } `json:"ResultInfo"` Feature []struct { ID string `json:"Id"` Gid string `json:"Gid"` Name string `json:"Name"` Geometry struct { Type string `json:"Type"` Coordinates string `json:"Coordinates"` } `json:"Geometry"` Category []string `json:"Category"` Description string `json:"Description"` Style []interface{} `json:"Style"` Property struct { UID string `json:"Uid"` CassetteID string `json:"CassetteId"` Country struct { Code string `json:"Code"` Name string `json:"Name"` } `json:"Country"` Address string `json:"Address"` GovernmentCode string `json:"GovernmentCode"` AddressMatchingLevel string `json:"AddressMatchingLevel"` PostalName string `json:"PostalName"` Station []struct { ID string `json:"Id"` SubID string `json:"SubId"` Name string `json:"Name"` Railway string `json:"Railway"` Exit string `json:"Exit"` ExitID string `json:"ExitId"` Distance string `json:"Distance"` Time string `json:"Time"` Geometry struct { Type string `json:"Type"` Coordinates string `json:"Coordinates"` } `json:"Geometry"` } `json:"Station"` } `json:"Property"` } `json:"Feature"` }
すぐにこんな構造体を返してくれました。
typeだけ直したら完成です。そのままコードに突っ込みます。
encoding/jsonでjsonをパース
まず、jsonを使うのでimportの中に
"encodig/json"
を足します。
処理は、前回のコードの最後に
var data1 YOLP // 定義した構造体変数を宣言 json.Unmarshal(body, &data1) // jsonパース fmt.Println(data1)
を加えるだけで完成。
めでたく住所などが表示されるようになりました。
YOLPを提供しているヤフー本社の郵便番号102-8282を指定すると
....東京都千代田区紀尾井町1-3東京ガーデンテラス紀尾井町紀尾井タワー 13101 6 ヤフー 株式会社......
のように、住所が正しく取れています。
まとめ
jsonデータを受け取った時はエンコードがjsonエンコードになっているので、
encoding/jsonをインポートして、Unmarshalでパースしましょう。