前提・実現したいこと
webAPIでJSON形式から以下の手順でデータを取ってこようとしたのですが、データを取得することができず、エラーが出ました。
URLかCodableでモデルを作っているところに誤りがあるのではないかと思っているのですが、解決できません。
ご教授いただけると幸いです。
※データは以下のようなJSON形式で取得できています。
発生している問題・エラーメッセージ
typeMismatch(Swift.Array<Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Array<Any> but found a dictionary instead.", underlyingError: nil))
該当のソースコード
Swift
1struct Results: Codable { 2 var resultsAvailable: String 3 var shop: Shop 4 5 // JSON中の項目名を変える 6 enum CodingKeys: String, CodingKey { 7 case resultsAvailable = "results_available" 8 case shop = "shop" 9 } 10} 11 12struct Shop: Codable { 13 var name: String? 14 var logoImage: String? 15 var address: String? 16 var stationName: String? 17 var open: String? 18 var lat: String? 19 var lng: String? 20 var photo: Photo? 21 22 enum CodingKeys: String, CodingKey { 23 case name = "name" 24 case logoImage = "logo_image" 25 case address = "address" 26 case stationName = "station_name" 27 case open = "open" 28 case lat = "lat" 29 case lng = "lng" 30 case photo = "photo" 31 } 32} 33 34struct Photo: Codable { 35 var mobile: Mobile? 36 37 enum CodingKeys: String, CodingKey { 38 case mobile = "mobile" 39 } 40 41struct Mobile: Codable { 42 var l: String? 43 44 enum CodingKeys: String, CodingKey { 45 case l = "l" 46 } 47} 48 49 50class SampleAPIViewController: UIViewController { 51 52 override func viewDidLoad() { 53 super.viewDidLoad() 54 55 guard let url = URL(string: "http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key=[自分のAPIキー]&large_area=Z011&format=json") else { return } 56 var request = URLRequest(url: url) 57 request.httpMethod = "GET" 58 let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 59 if let error = error { 60 print("情報の取得に失敗しました。",error) 61 return 62 } 63 if let data = data { 64 do { 65 let shop = try JSONDecoder().decode([Shop].self, from: data) 66 print("json",shop) 67 } catch(let error) { 68 print("情報の取得に失敗しました。",error) 69 } 70 71 } 72 } 73 task.resume() 74 } 75}
JSON
1{ 2 "results":{ 3 "api_version":"1.26", 4 "results_available":27481, 5 "results_returned":"10", 6 "results_start":1, 7 "shop":[ 8 { 9 "access":"JR赤羽駅東口より徒歩約2分/東京メトロ南北線,埼玉高速鉄道赤羽岩淵駅1出口より徒歩約8分", 10 "address":"東京都北区赤羽1-10-6 2F", 11 "band":"不可", 12 "barrier_free":"なし", 13 "budget":{ 14 "average":"2000円(時間無制限昼飲み放題◎食べ放題コースは税込1500円~)", 15 "code":"B001", 16 "name":"1501~2000円" 17 }, 18 "budget_memo":"【コスパ最強居酒屋】うまい!安い!早い!昼飲みも大歓迎♪", 19 "capacity":30, 20 "card":"利用可", 21 "catch":"Gotoeatキャンペーン対応! 昼飲み放題無制限1400円!", 22 "charter":"貸切不可", 23 "child":"お子様連れOK", 24 "close":"1月1日のみお休み致します。", 25 "coupon_urls":{ 26 "pc":"https://www.hotpepper.jp/strJ001261286/map/?vos=nhppalsa000016", 27 "sp":"https://www.hotpepper.jp/strJ001261286/scoupon/?vos=nhppalsa000016" 28 }, 29 "course":"あり", 30 "english":"あり", 31 "free_drink":"あり :コスパ抜群!", 32 "free_food":"あり :コスパ抜群!", 33 "genre":{ 34 "catch":"東京 赤羽 居酒屋 個室 接待 宴会 昼飲み", 35 "code":"G001", 36 "name":"居酒屋" 37 }, 38 "horigotatsu":"なし", 39 "id":"J001261286", 40 "karaoke":"なし", 41 "ktai_coupon":0, 42 "large_area":{ 43 "code":"Z011", 44 "name":"東京" 45 }, 46 "large_service_area":{ 47 "code":"SS10", 48 "name":"関東" 49 }, 50 "lat":35.7794880014, 51 "lng":139.7217460588, 52 "logo_image":"https://imgfp.hotp.jp/IMGH/17/09/P037061709/P037061709_69.jpg", 53 "lunch":"なし", 54 "middle_area":{ 55 "code":"Y051", 56 "name":"赤羽・王子・十条" 57 }, 58 "midnight":"営業していない", 59 "mobile_access":"JR赤羽駅東口より2分/東京メトロ南北線より8分", 60 "name":"大衆居酒屋のんべえ 赤羽本店", 61 "name_kana":"たいしゅういざかやのんべえあかばねほんてん", 62 "non_smoking":"禁煙席なし", 63 "open":"月~日、祝日、祝前日: 11:00~20:00 (料理L.O. 19:00 ドリンクL.O. 19:00)", 64 "other_memo":"中国語メニューあり", 65 "parking":"なし", 66 "party_capacity":50, 67 "pet":"不可", 68 "photo":{ 69 "mobile":{ 70 "l":"https://imgfp.hotp.jp/IMGH/82/15/P037498215/P037498215_168.jpg", 71 "s":"https://imgfp.hotp.jp/IMGH/82/15/P037498215/P037498215_100.jpg" 72 }, 73 "pc":{ 74 "l":"https://imgfp.hotp.jp/IMGH/82/15/P037498215/P037498215_238.jpg", 75 "m":"https://imgfp.hotp.jp/IMGH/82/15/P037498215/P037498215_168.jpg", 76 "s":"https://imgfp.hotp.jp/IMGH/82/15/P037498215/P037498215_58_s.jpg" 77 } 78 }, 79 "private_room":"なし", 80 "service_area":{ 81 "code":"SA11", 82 "name":"東京" 83 }, 84 "shop_detail_memo":"", 85 "show":"なし", 86 "small_area":{ 87 "code":"X141", 88 "name":"赤羽" 89 }, 90 "station_name":"赤羽", 91 "sub_genre":{ 92 "code":"G001", 93 "name":"居酒屋" 94 }, 95 "tatami":"なし", 96 "tv":"なし", 97 "urls":{ 98 "pc":"https://www.hotpepper.jp/strJ001261286/?vos=nhppalsa000016" 99 }, 100 "wedding":"", 101 "wifi":"あり" 102 }, 103 ...以下省略... 104 ] 105 } 106}
試したこと
let shop = try JSONDecoder().decode([Shop].self, from: data)を
let shop = try JSONDecoder().decode(Shop.self, from: data)でも試しましたが、
次は全てnilで返ってきてしまい、情報を取得することができません。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー