質問編集履歴

2

ソースコードの書き換え、問題点の特定

2024/09/04 10:05

投稿

Family
Family

スコア1

test CHANGED
@@ -1 +1 @@
1
- Swift JSONの取得ができない
1
+ Swift  JSONデータの取得
test CHANGED
@@ -2,7 +2,9 @@
2
2
  JSONの取得をし、検索結果を一覧表示できるようにしたい。
3
3
 
4
4
  ### 発生している問題・分からないこと
5
- エストURLは正常、エラーも出ていないので、ResultJson(item: nil)とJSONデータが帰ってきてしまっています。どこを修正すれば良いのから、教えてただければ幸いです
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キー取得済みです]&format=json&keyword=\(keyword_encode)&order=20") else {
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, _) = try await URLSession.shared.data(from: req_url)
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
- Googleで類似問題を調べたものの、りくものがありせんでした
141
+ responseがHTTPURLResponse型にキャストきるか確認すると、HTTPステータスコード: 200と出力されているでレスポンスヘッダーが正しく取得されていと思い
133
-
134
142
  ### 補足
135
- 修正しました
143
+ 修正しました(2回目)

1

ソースコードの書き換え、発生している問題

2024/09/03 17:12

投稿

Family
Family

スコア1

test CHANGED
File without changes
test CHANGED
@@ -2,8 +2,7 @@
2
2
  JSONの取得をし、検索結果を一覧表示できるようにしたい。
3
3
 
4
4
  ### 発生している問題・分からないこと
5
- リクエストURLは正常に作成されていて、エラーも出てないのですが、リクエスト生成とJSONの取得くいっていいからだと考えていす。
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
- else {
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=ここにAPIキー入力&format=json&keyword=\(keyword_encode)&max=10&order=r") else {
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 {return}
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
- }// OmiseData ここまで
121
+ }
104
-
105
122
 
106
123
  ```
107
124
 
@@ -115,4 +132,4 @@
115
132
  Googleで類似の問題を調べたものの、しっくりくるものがありませんでした。
116
133
 
117
134
  ### 補足
118
- 特にな
135
+ 修正ました