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

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

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

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

JSON

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

266閲覧

データが入っているはずのJSONのキーからnilが返ってくる

退会済みユーザー

退会済みユーザー

総合スコア0

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

JSON

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2019/01/13 19:27

プログラミングは初心者。
現在書籍のバーコードを読み取って書籍の情報(タイトル・著者名・本の画像・あらすじ)を取得する機能の実装に挑戦しています。
GoogleのAPIを使って、JSONデータを取得し、その中から情報を取り出そうとしているのですが、情報が入っているはずなのに、コンソールで確認するとnilと返って来てしまいます。

swift

1import UIKit 2import AVFoundation 3 4class CodeReaderVC: UIViewController, AVCaptureMetadataOutputObjectsDelegate { 5 6 private let session = AVCaptureSession() 7var itemInfo: [[String: Any]] = [] 8 9//ここまでにカメラでバーコードを読み取る処理を記述 10 11var isbnCode: String = "" 12 13 func metadataOutput(_ output:AVCaptureMetadataOutput, didOutput metadataObjects:[AVMetadataObject],from connection: AVCaptureConnection){ 14 for metadata in metadataObjects as! [AVMetadataMachineReadableCodeObject]{ 15 if metadata.stringValue == nil{ 16 continue 17 } 18 19 print(metadata.type) 20 print(metadata.stringValue!) 21 22 self.isbnCode = "(metadata.stringValue!)" 23 print(isbnCode) 24 let alert: UIAlertController = UIAlertController(title: "バーコードを取得しました", message: metadata.stringValue,preferredStyle: UIAlertController.Style.alert) 25 26 let cancel: UIAlertAction = UIAlertAction(title:"OK", style: UIAlertAction.Style.cancel, handler: nil) 27 alert.addAction(cancel) 28 present(alert,animated: true,completion: nil) 29 } 30 31 print(isbnCode) 32 33 let sturl = ("https://www.googleapis.com/books/v1/volumes?q=9784087455915") 34 print(sturl) 35 let url = URL(string: sturl)! 36 let task: URLSessionTask = URLSession.shared.dataTask(with: url, completionHandler: { data, response, error in 37 do { 38 39 let json = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments) as! [String: Any] 40 41 let items = json["items"] as? [Any] 42 let itemsfirst = items?[0] as? [String: Any] 43 print(String(describing: itemsfirst)) 44 45 let volumeInfo = itemsfirst?["volumeInfo"] as? [String: Any] 46   //現在ここからとnilの結果が帰ってきます 47 print("volumeInfo: (String(describing: volumeInfo))") 48          49        //volumeInfoの中からタイトル・著者名・あらすじを取り出したい 50 let title = volumeInfo?["title"] as? [String: Any] 51 let authors = volumeInfo?["authors"] as? [String: Any] 52 let description = volumeInfo?["description"] as? [String: Any] 53 54 print(String(describing: title)) 55 56 //volumeInfoの中からthumbnailを取り出したい 57 let imageLinks = volumeInfo?["imageLinks"] as? [String: Any] 58 let thumbnail = imageLinks?["thumbnail"] as? [String: Any] 59 print(String(describing: thumbnail)) 60 61 //取り出した3つの要素を配列に入れたい 62 let itemInfoArray = [title, authors, description] as? [[String: Any]] 63 print(String(describing: itemInfoArray)) 64 65 }catch{ 66 print("error") 67 } 68 }) 69 task.resume() 70 71 } 72

さまざまな書籍のバーコードを読み取って試してみましたがそのそのどれもnilという結果が返って来ました。
エラー文も出ていないので何が原因が検討がつきません。
どのようにしたら入っているものを取れるようになるのか、教えてくださると嬉しいです。

作業環境
MacOS High Sierra バージョン10.13.6
メモリ8GB
Xcode10.1
Swift4.2.1
現在キャリア契約の切れたiPhone5s(iOS10.3.3) Deployment Target10.3に設定してWi-Fiで繋いで実機テストしています。

重ねてよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

swift

1let title = volumeInfo?["title"] as? [String: Any]
  • volumeInfo?["title"]がアンラップされていない
  • "title": "ほげほげ"なので、キャストは[String: Any]ではなくString

投稿2019/01/15 01:23

fuzzball

総合スコア16731

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

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

退会済みユーザー

退会済みユーザー

2019/01/16 09:00

アドバイスありがとうございます! let title = volumeInfo?["titile"] as? [String: Any] print(title!) と書き換えたらコンソールに情報が表示されました。 これは無事にアンラップすることができたということでよろしいでしょうか。 それと、authorsのところがどうやら "authors": ["hogehoge"]といったようになっているのですが(著者はおそらく複数人いる場合もあるのだと思います)、この場合どのように書けば取り出せるでしょうか。 ご教示いただけると幸いです。
fuzzball

2019/01/16 09:07

何一つ理解出来ていないことに感心します。
退会済みユーザー

退会済みユーザー

2019/01/16 09:22

let title = volumeInfo?["title"] as! String こう書き直したら、同じようにコンソールに出力されました よく考えてみたら上記だとコンソールに出力するときだけアンラップするということになるので全く解決になってなかったのですね。 まだまだ私は勉強が必要みたいです。ありがとうございます。 他にもまだ私が見落としているようなところはあるでしょうか?
退会済みユーザー

退会済みユーザー

2019/01/16 09:44

authorsのところを[Any]型でキャストしてみたらうまく取れました。 答えてくださりありがとうございました!
fuzzball

2019/01/16 09:47 編集

だからなんでAnyになっちゃうの?動けばいい、でやってるから全く前に進んでない。
退会済みユーザー

退会済みユーザー

2019/01/16 10:51

あれ、そうなんですか!? 私がAnyにした経緯は https://fukatsu.tech/api-tableview#i このサイトを参考に調べて制作を進めている時に、【JSONをパースする】という項目の中で、 "authos" : ["hoge"]という形なら、型は[Any]としてキャストした方がいいのではと判断したからです。 let authors = volumeInfo?["authors"] as! [String: Any] print(authors) や let authors = volumeInfo?["authors"] as! String print(authors) Thread 10: signal SIGABRT と出てきたのでてっきりAnyが正解なのだと思い込みました。 ちなみに上のエラーが出た時に Could not cast value of type 'NSSingleObjectArrayI' (0x3b5244d0) to 'NSString' (0x3b52d0ac) というような文章が出てきました。
fuzzball

2019/01/17 00:11

authosの型が何なのか把握/理解してないのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問