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

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

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

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

Swift

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

Q&A

解決済

1回答

1061閲覧

APIのレスポンスを受け取れない

Ytan

総合スコア39

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/07/25 17:37

補足

前回のリクエストではJSONSerializationを使用していたため
レスポンスとして返っていなかったのですが、APIサイトで元々取得できるようで
実際リクエストを投げてみました。
上記のように取得できました。そのためコードを増やしました。

疑問点

APIのリクエストの仕方は合っていると思いますが

JSON error

とコンソールには出ます。
画像のように結果を取得するには、

https://api.themoviedb.org/3/search/movie?api_key=自分のAPI&language=ja&query=fight%20club

となるのですが通信の仕方は間違っていないような気がするのですがなぜですか?
コンソールから見てdecodeができていないのか、それとも
MovieStructを配列に入れていないからですか?
それは試したところMovieResultに影響が出てエラーになってしまいます。

ソースコード

Swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 @IBOutlet weak var movieTableView: UITableView! 6 7 var movies = [Movie]() 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 // Do any additional setup after loading the view. 12 13 fechData() 14 } 15 16 func fechData(){ 17 18 movies.removeAll() 19 20 //&language=ja&query=zero 21 URLSession.shared.dataTask(with: URL(string: "https://api.themoviedb.org/3/search/movie?api_key=自分のAPI&language=ja&query=fight%20club")!, 22 completionHandler: {data, response, error in 23 24 guard let data = data else { 25 print(error?.localizedDescription ?? "Unknown error") 26 return 27 } 28 29 var result: MovieStruct? 30 do { 31 result = try JSONDecoder().decode(MovieStruct.self, from: data) 32 } 33 catch{ 34 print("JSON error") 35 } 36 37 guard let finalResult = result else{ 38 return 39 } 40 41 print("(finalResult.MovieResult.first?.title)") 42 43 let newMovies = finalResult.MovieResult 44 self.movies.append(contentsOf: newMovies) 45 46 DispatchQueue.main.async { 47 self.movieTableView.reloadData() 48 } 49 }).resume() 50 } 51} 52 53extension ViewController:UITableViewDelegate,UITableViewDataSource{ 54 55 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 56 return movies.count 57 } 58 59 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 60 return UITableViewCell() 61 } 62 63 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 64 tableView.deselectRow(at: indexPath, animated: true) 65 } 66} 67 68struct MovieStruct:Codable { 69 let MovieResult: [Movie] 70} 71 72struct Movie: Codable { 73 let title: String 74 let release_date:String 75 let poster_path:String 76}

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

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

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

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

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

guest

回答1

0

ベストアンサー

こういうエラーを防ぐには、オンラインなり何なりの JSON 分析ページを活用するのがいいかと思います。

たとえば、

JSONのタグとdecode(MovieStruct.self, from: data)で呼び出している構造体の変数名が一致していないのがひとつ目の理由かと思います。

JSON の最初をみると(Firefox で直接見た場合)

JSON

1page 1 2total_results 22 3total_pages 2 4results []

となっています。結果一覧は results というタグで返ってきていますが、対応させている構造体は

Swift

1struct MovieStruct:Codable { 2 let MovieResult: [Movie] 3}

と一致していません(results != MovieResult)。とりあえず単純に変数名を揃えればよいので、

Swift

1struct MovieStruct:Codable { 2 let results: [Movie] 3}

とします。

また、二つ目の理由ですが、いくつかのデータについては欠損が発生しているようです。

Swift

1struct Movie: Codable { 2 let title: String 3 let release_date:String 4 let poster_path:String 5}

これらの変数のうち、release_dateposter_path については、映画によってはデータが存在しない場合があるようです。

なので

Swift

1struct Movie: Codable { 2 let title: String 3 let release_date:String? 4 let poster_path:String? 5}

とオプショナル型で宣言し、データが存在しない場合には nil が入るようにしておきます。

上記の変更に伴い、

Swift

1 print("(finalResult.MovieResult.first?.title)") 2 let newMovies = finalResult.MovieResult

Swift

1 print("(finalResult.results.first?.title)") 2 let newMovies = finalResult.results

となります。

また、テービュルビューのセルを生成する部分でタイトルを代入していないので、その辺りは適切に変更してみていただけますでしょうか。

これらの変更を行えば、タイトル一覧が表示されるかと思います。

イメージ説明

投稿2020/07/25 22:29

編集2020/07/25 22:49
TsukubaDepot

総合スコア5086

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

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

Ytan

2020/07/26 07:12

上手く取得することが出来ました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問