まさひちの道具箱

趣味の話から技術・仕事まであらゆることをたれ流していきます

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/jsonjsonをパース

まず、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でパースしましょう。