質問編集履歴
2
ソースコードの書き換え、問題点の特定
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Swift JSONの取得
|
1
|
+
Swift JSONデータの取得
|
test
CHANGED
@@ -2,7 +2,9 @@
|
|
2
2
|
JSONの取得をし、検索結果を一覧表示できるようにしたい。
|
3
3
|
|
4
4
|
### 発生している問題・分からないこと
|
5
|
-
|
5
|
+
デバッグの方でguard let items = json.item else { ... }のブロックで「アイテムが見つかりませんでした」と出力されてしまいます。おそらく、そのためResultJson(item: nil)とJSONデータが帰ってきてしまってるんだと考えています。しかし、どのように修正すべきか分からないです、、、
|
6
|
+
どうかご教示よろしくお願いいたします。
|
7
|
+
|
6
8
|
|
7
9
|
|
8
10
|
### 該当のソースコード
|
@@ -64,7 +66,7 @@
|
|
64
66
|
}
|
65
67
|
|
66
68
|
// リクエストURLの組み立て
|
67
|
-
guard let req_url = URL(string: "https://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key=[APIキー
|
69
|
+
guard let req_url = URL(string: "https://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key=[APIキー取得済みです]&format=json&keyword=\(keyword_encode)&order=1") else {
|
68
70
|
print("リクエストURLの組み立てに失敗しました")
|
69
71
|
return
|
70
72
|
}
|
@@ -73,7 +75,14 @@
|
|
73
75
|
|
74
76
|
do {
|
75
77
|
// リクエストURLからダウンロード
|
76
|
-
let (data,
|
78
|
+
let (data, response) = try await URLSession.shared.data(from: req_url)
|
79
|
+
|
80
|
+
// responseがHTTPURLResponse型にキャストできるか確認
|
81
|
+
if let httpResponse = response as? HTTPURLResponse {
|
82
|
+
// HTTPレスポンスステータスコードやレスポンスヘッダーの確認
|
83
|
+
print("HTTPステータスコード: \(httpResponse.statusCode)")
|
84
|
+
print("HTTPヘッダー: \(httpResponse.allHeaderFields)")
|
85
|
+
}
|
77
86
|
|
78
87
|
// 取得したJSONデータを文字列として出力
|
79
88
|
if let jsonString = String(data: data, encoding: .utf8) {
|
@@ -129,7 +138,6 @@
|
|
129
138
|
- [ ] その他
|
130
139
|
|
131
140
|
##### 上記の詳細・結果
|
132
|
-
|
141
|
+
responseがHTTPURLResponse型にキャストできるか確認すると、HTTPステータスコード: 200と出力されているのでレスポンスヘッダーが正しく取得されていると思います。
|
133
|
-
|
134
142
|
### 補足
|
135
|
-
修正しました
|
143
|
+
修正しました(2回目)
|
1
ソースコードの書き換え、発生している問題
test
CHANGED
File without changes
|
test
CHANGED
@@ -2,8 +2,7 @@
|
|
2
2
|
JSONの取得をし、検索結果を一覧表示できるようにしたい。
|
3
3
|
|
4
4
|
### 発生している問題・分からないこと
|
5
|
-
リクエストURLは正常
|
5
|
+
リクエストURLは正常であり、エラーも出ていないのですが、ResultJson(item: nil)とJSONデータが帰ってきてしまっています。どこを修正すれば良いのかわから、教えていただければ幸いです。
|
6
|
-
|
7
6
|
|
8
7
|
|
9
8
|
### 該当のソースコード
|
@@ -49,7 +48,7 @@
|
|
49
48
|
//Taskは非同期で処理を実行できる
|
50
49
|
Task {
|
51
50
|
//ここから先は非同期で処理される
|
52
|
-
//非同期でお
|
51
|
+
//非同期でお菓子を検索する
|
53
52
|
await search(keyword: keyword)
|
54
53
|
}//Taskここまで
|
55
54
|
}//searchOmiseここまで
|
@@ -58,50 +57,68 @@
|
|
58
57
|
//@MainActorを使いメインスレッドを更新する
|
59
58
|
@MainActor
|
60
59
|
private func search(keyword: String) async {
|
61
|
-
//お店の検索キーワードをURLエンコードする
|
60
|
+
// お店の検索キーワードをURLエンコードする
|
62
|
-
guard let keyword_encode = keyword.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
|
61
|
+
guard let keyword_encode = keyword.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {
|
63
|
-
|
62
|
+
print("URLエンコードに失敗しました")
|
64
63
|
return
|
65
64
|
}
|
66
65
|
|
67
|
-
//リクエストURLの組み立て
|
66
|
+
// リクエストURLの組み立て
|
68
|
-
guard let req_url = URL(string: "https://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key=
|
67
|
+
guard let req_url = URL(string: "https://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key=[APIキーは取得済みです]&format=json&keyword=\(keyword_encode)&order=20") else {
|
68
|
+
print("リクエストURLの組み立てに失敗しました")
|
69
69
|
return
|
70
70
|
}
|
71
|
-
//デバッグエリアに出力
|
71
|
+
// デバッグエリアに出力
|
72
72
|
print(req_url)
|
73
73
|
|
74
74
|
do {
|
75
|
-
//リクエストURLからダウンロード
|
75
|
+
// リクエストURLからダウンロード
|
76
|
-
let(data, _) = try await URLSession.shared.data(from: req_url)
|
76
|
+
let (data, _) = try await URLSession.shared.data(from: req_url)
|
77
|
+
|
78
|
+
// 取得したJSONデータを文字列として出力
|
79
|
+
if let jsonString = String(data: data, encoding: .utf8) {
|
80
|
+
print("取得したJSONデータ: \(jsonString)")
|
81
|
+
}
|
82
|
+
|
77
|
-
//JSONDecoderのインスタンスを取得
|
83
|
+
// JSONDecoderのインスタンスを取得
|
78
84
|
let decoder = JSONDecoder()
|
79
|
-
//受け取ったJSONデータをパースして格納
|
80
|
-
let json = try decoder.decode(ResultJson.self, from: data)
|
81
85
|
|
86
|
+
// JSONのパースを別のdo-catchで行う
|
87
|
+
do {
|
88
|
+
let json = try decoder.decode(ResultJson.self, from: data)
|
89
|
+
print("パース成功: \(json)")
|
90
|
+
|
82
|
-
//お店の情報が獲得できているか確認
|
91
|
+
// お店の情報が獲得できているか確認
|
83
|
-
guard let items = json.item else {
|
92
|
+
guard let items = json.item else {
|
93
|
+
print("アイテムが見つかりませんでした")
|
94
|
+
return
|
95
|
+
}
|
84
|
-
//お店のリストを初期化
|
96
|
+
// お店のリストを初期化
|
85
|
-
omiseList.removeAll()
|
97
|
+
omiseList.removeAll()
|
98
|
+
|
99
|
+
// 取得しているお店の数だけ処理
|
100
|
+
for item in items {
|
101
|
+
// お店の名称、掲載URL、画像URLをアンラップ
|
102
|
+
if let name = item.name,
|
103
|
+
let link = item.url,
|
104
|
+
let image = item.image {
|
105
|
+
// 一つのお店を構造体でまとめて管理
|
106
|
+
let omise = OmiseItem(name: name, link: link, image: image)
|
107
|
+
// お店の配列へ追加
|
108
|
+
omiseList.append(omise)
|
109
|
+
}
|
110
|
+
}
|
111
|
+
print(omiseList)
|
112
|
+
} catch {
|
113
|
+
// JSONデコードのエラーをキャッチ
|
114
|
+
print("デコードエラー: \(error)")
|
115
|
+
}
|
86
116
|
|
87
|
-
|
88
|
-
for item in items {
|
89
|
-
if let name = item.name,
|
90
|
-
let link = item.url,
|
91
|
-
let image = item.image {
|
92
|
-
//一つのお店を構造体でまとめて管理
|
93
|
-
let omise = OmiseItem(name: name, link: link, image: image)
|
94
|
-
//お店の配列へ追加
|
95
|
-
omiseList.append(omise)
|
96
|
-
}
|
97
|
-
}
|
98
|
-
print(omiseList)
|
99
117
|
} catch {
|
100
118
|
print("エラーが出ました")
|
101
|
-
}// do ここまで
|
119
|
+
} // do ここまで
|
102
|
-
}// searchここまで
|
120
|
+
} // search ここまで
|
103
|
-
}
|
121
|
+
}
|
104
|
-
|
105
122
|
|
106
123
|
```
|
107
124
|
|
@@ -115,4 +132,4 @@
|
|
115
132
|
Googleで類似の問題を調べたものの、しっくりくるものがありませんでした。
|
116
133
|
|
117
134
|
### 補足
|
118
|
-
|
135
|
+
修正しました
|