質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.59%

JSON - ネストした構造体の一つのデータを取り出したいです。「ぐるなびAPIを使用中」

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,458

score 29

はじめに

ぐるなびのAPIを使ってレストランの情報を取り出し開発中のアプリに使いたいと思っています。

実現したいこと

レストランの名前だけを取得したいです。現状、取得したデータをすべてを表示していて、使い勝手が悪いです。

type AutoGenerated struct {
    Attributes struct {
        APIVersion string `json:"api_version"`
    } `json:"@attributes"`
    TotalHitCount json.Number `json:"total_hit_count"`
    HitPerPage    json.Number `json:"hit_per_page"`
    PageOffset    json.Number `json:"page_offset"`
    Rest          []struct {
        Attributes struct {
            Order json.Number `json:"order"`
        } `json:"@attributes"`
        ID         string    `json:"id"`
        UpdateDate time.Time `json:"update_date"`
        Name       string    `json:"name"`
        NameKana   string    `json:"name_kana"`
        Latitude   string    `json:"latitude"`
        Longitude  string    `json:"longitude"`
        Category   string    `json:"category"`
        URL        string    `json:"url"`
        URLMobile  string    `json:"url_mobile"`
        CouponURL  struct {
            Pc     string `json:"pc"`
            Mobile string `json:"mobile"`
        } `json:"coupon_url"`
        ImageURL struct {
            ShopImage1 string `json:"shop_image1"`
            ShopImage2 string `json:"shop_image2"`
            Qrcode     string `json:"qrcode"`
        } `json:"image_url"`
        Address  string `json:"address"`
        Tel      string `json:"tel"`
        TelSub   string `json:"tel_sub"`
        Fax      string `json:"fax"`
        Opentime string `json:"opentime"`
        Holiday  string `json:"holiday"`
        Access   struct {
            Line        string `json:"line"`
            Station     string `json:"station"`
            StationExit string `json:"station_exit"`
            Walk        string `json:"walk"`
            Note        string `json:"note"`
        } `json:"access"`
        ParkingLots string `json:"parking_lots"`
        Pr          struct {
            PrShort string `json:"pr_short"`
            PrLong  string `json:"pr_long"`
        } `json:"pr"`
        Code struct {
            Areacode      string   `json:"areacode"`
            Areaname      string   `json:"areaname"`
            Prefcode      string   `json:"prefcode"`
            Prefname      string   `json:"prefname"`
            AreacodeS     string   `json:"areacode_s"`
            AreanameS     string   `json:"areaname_s"`
            CategoryCodeL []string `json:"category_code_l"`
            CategoryNameL []string `json:"category_name_l"`
            CategoryCodeS []string `json:"category_code_s"`
            CategoryNameS []string `json:"category_name_s"`
        } `json:"code"`
        Budget     json.Number `json:"budget"`
        Party      json.Number `json:"party"`
        Lunch      json.Number `json:"lunch"`
        CreditCard string      `json:"credit_card"`
        EMoney     string      `json:"e_money"`
        Flags      struct {
            MobileSite   json.Number `json:"mobile_site"`
            MobileCoupon json.Number `json:"mobile_coupon"`
            PcCoupon     json.Number `json:"pc_coupon"`
        } `json:"flags"`
    } `json:"rest"`

コード

fmt.Println(s.Rest)ならネストしているRestの中身がすべて出力されます。
fmt.Println(s.Rest.Name)はundefinedエラーです。

func Get(w http.ResponseWriter, r *http.Request) {
    resp, err := http.Get("URL")
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }

    var s AutoGenerated
    err = json.Unmarshal(body, &s)
    if err != nil {
        log.Fatalln(err)
    }

    fmt.Println(s.Rest) // 表示するデータが多く余計

    fmt.Println(s.Rest.Name) // これはundefinedとエラーになります。
}

試したこと

Goで入れ子になった構造体へ値を代入したい

こちらを参考にネストした構造体を外へ出してみましたが、変わりませんでした。

お願いしたいこと

本文掲載の構造体を使って、レストランの名前だけをコンソールへ出力したいです。
なにかご教授下さい。
宜しくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

Restの型を良く確認ください。スライスなのでスライス要素の取り出しを先にしないとName要素は取り出せません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Goに関する質問
  • JSON - ネストした構造体の一つのデータを取り出したいです。「ぐるなびAPIを使用中」