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

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

ただいまの
回答率

88.77%

URLからデータを取得したい

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 528

totot

score 20

fetchVenueを呼び出したところ
keyNotFound(CodingKeys(stringValue: "group", intValue: nil), Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "response", intValue: nil)], debugDescription: "No value associated with key CodingKeys(stringValue: \"group\", intValue: nil) (\"group\").", underlyingError: nil))
というエラーが出てしまい、データを取得できません。
解決方法を教えていただけないでしょうか?

class Service {

    static let shared = Service()


    func fetchVenue(location: CLLocationCoordinate2D, completion: @escaping (Empty?, Error?) -> ()) {

        let urlString = "https://api.foursquare.com/v2/search/recommendations?ll=\(location.latitude),\(location.longitude)&v=20160607&intent=coffee&limit=15&client_id=\(client_id)&client_secret=\(client_secret)"

        fetchGenericJSONData(urlString: urlString, completion: completion)
    }

    func fetchGenericJSONData<T: Codable>(urlString: String, completion: @escaping (T?, Error?) -> ()) {

        guard let url = URL(string: urlString) else { return }
        URLSession.shared.dataTask(with: url) { (data, resp, err) in
            if let err = err {
                completion(nil, err)
                return
            }
            do {
                let objects = try JSONDecoder().decode(T.self, from: data!)
                // success
                completion(objects, nil)
            } catch {
                completion(nil, error)
            }
            }.resume()
    }
}
{  
   "meta":{  
      "code":200,
      "requestId":"5cd6fa5e9fb6b75700851759"
   },
   "response":{  
      "group":{  
         "results":[  
            {  
               "displayType":"venue",
               "venue":{  
                  "id":"4c4fde46dcb5d13ad7b10108",
                  "name":"Fruit de saison (フルーフ・デゥ・セゾン)",
                  "contact":{  

                  },
                  "location":{  
                     "address":"外神田4-11-2",
                     "lat":35.702276108565556,
                     "lng":139.77286384637375,
                     "labeledLatLngs":[  
                        {  
                           "label":"display",
                           "lat":35.702276108565556,
                           "lng":139.77286384637375
                        }
                     ],
                     "distance":223,
                     "postalCode":"101-0021",
                     "cc":"JP",
                     "city":"東京",
                     "state":"東京都",
                     "country":"日本",
                     "formattedAddress":[  
                        "外神田4-11-2",
                        "千代田区, 東京都",
                        "101-0021",
                        "日本"
                     ]
                  },
                  "categories":[  
                     {  
                        "id":"4bf58dd8d48988d16d941735",
                        "name":"Café",
                        "pluralName":"Cafés",
                        "shortName":"Café",
                        "icon":{  
                           "prefix":"https:\/\/ss3.4sqi.net\/img\/categories_v2\/food\/cafe_",
                           "suffix":".png"
                        },
                        "primary":true
                     }
                  ],
                  "verified":false,
                  "stats":{  
                     "tipCount":0,
                     "usersCount":0,
                     "checkinsCount":0,
                     "visitsCount":0
                  },
                  "dislike":false,
                  "ok":false,
                  "beenHere":{  
                     "count":0,
                     "lastCheckinExpiredAt":0,
                     "marked":false,
                     "unconfirmedCount":0
                  }
               },
               "id":"5cd6fa5fa795bd0039c46dfc",
               "photo":{  
                  "id":"51bfd28d498e80f211f96907",
                  "createdAt":1371525773,
                  "prefix":"https:\/\/fastly.4sqi.net\/img\/general\/",
                  "suffix":"\/52296049_SkW5N14j2phk0gmnmQ3XGhBFCjy5KJkak2fhB7tKju4.jpg",
                  "width":720,
                  "height":960,
                  "visibility":"public"
               },
               "snippets":{  
                  "count":1,
                  "items":[  
                     {  
                        "detail":{  
                           "type":"tip",
                           "object":{  
                              "id":"56dc0836498ee85362455de5",
                              "createdAt":1457260598,
                              "text":"great selection of heavenly yummy desserts",
                              "type":"user",
                              "canonicalUrl":"https:\/\/foursquare.com\/item\/56dc0836498ee85362455de5",
                              "logView":true,
                              "agreeCount":0,
                              "disagreeCount":0,
                              "todo":{  
                                 "count":0
                              },
                              "user":{  
                                 "id":"11175627",
                                 "firstName":"Roldan",
                                 "lastName":"Toribio",
                                 "gender":"male",
                                 "photo":{  
                                    "prefix":"https:\/\/fastly.4sqi.net\/img\/user\/",
                                    "suffix":"\/ZDDPKA4LIZFCVYQ4.jpg"
                                 }
                              }
                           }
                        }
                     }
                  ]
               }
            }
         ],
         "totalResults":112
      },
      "context":{  
         "searchLocationNearYou":true,
         "searchLocationMapBounds":false,
         "searchLocationType":"NearYou",
         "currentLocation":{  
            "what":"",
            "where":"",
            "feature":{  
               "cc":"JP",
               "name":"Akihabara",
               "displayName":"Akihabara, Tokyo, Tōkyō",
               "woeType":22,
               "slug":"akihabara-japan",
               "id":"maponics:10004338",
               "longId":"10004338",
               "geometry":{  
                  "center":{  
                     "lat":35.701304,
                     "lng":139.775174
                  },
                  "bounds":{  
                     "ne":{  
                        "lat":35.706567,
                        "lng":139.780981
                     },
                     "sw":{  
                        "lat":35.6968,
                        "lng":139.769614
                     }
                  }
               },
               "encumbered":true
            },
            "parents":[  

            ]
         },
         "boundsSummaryRadius":600,
         "relatedNeighborhoods":[  

         ],
         "geoParams":{  
            "ll":"35.7020691,139.7753269",
            "radius":"600"
         },
         "geoBounds":{  
            "circle":{  
               "center":{  
                  "lat":35.7020691,
                  "lng":139.7753269
               },
               "radius":600
            }
         }
      }
   }
}
struct Empty: Codable {
    let response: Response
}
struct Response: Codable {
    let group: Group
}
struct Group: Codable {
    let results: [Result]
    let totalResults: Int
}
struct Result: Codable {
    let venue: Venue
}
struct Venue: Codable {
    let id, name: String
    let contact: Contact
    let location: Location
    let categories: [Category]
    let verified: Bool
    let dislike, ok: Bool
    let beenHere: BeenHere
}
struct BeenHere: Codable {
    let count, lastCheckinExpiredAt: Int
    let marked: Bool
    let unconfirmedCount: Int
}
struct Category: Codable {
    let id, name, pluralName, shortName: String
    let primary: Bool
}
struct Contact: Codable {
}
struct Location: Codable {
    let address: String
    let lat, lng: Double
    let distance: Int
    let postalCode, cc, city, state: String
    let country: String
    let formattedAddress: [String]
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

まだ回答がついていません

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

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

関連した質問

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