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

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

新規登録して質問してみよう
ただいま回答率
85.46%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

0回答

572閲覧

webAPIを使ってデータを取得するのに失敗する

junshu310

総合スコア0

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/04/25 16:58

前提・実現したいこと

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomato879241

2021/04/25 22:45

返ってくるデータは配列ではなくDictionaryです。それには「api_version」、「results_available」、「results_returned」、「results_start」、「shop」のキーが入っています。そのことを念頭にJSONDecoderによるJSONのデータの読み方を勉強してください。
hoshi-takanori

2021/04/26 00:46

Results の shop は配列ですね。また、Results の外側にもう一つオブジェクトがあるのでは。
tomato879241

2021/04/27 21:04

データ・モデルの作り方の基本ができていません。results_availableのデータ・タイプはStringではありません。latやlngのデータ・タイプもStringではありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問