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

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

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

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

Xcode

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

Swift

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

Q&A

解決済

1回答

530閲覧

JSONデータの中から特定のキーを持つ値を取り出したい

yuyu_yuyui22

総合スコア20

JSON

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

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/01/09 07:58

こんにちは
プログラミングはまだまだわからないことだらけです。
現在APIを利用して取得したJSONデータの特定の要素をテーブルビュー出力しようと考えて居ます。
そこで、JSONデータの扱い方でわからないことがあります。

Swift

1 let url: URL = URL(string: "https://www.googleapis.com/books/v1/volumes?q=4022591323")! 2 let task: URLSessionTask = URLSession.shared.dataTask(with: url, completionHandler: { data, response, error in 3 do { 4 let json = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments) as! [String: Any] 5 print(json) 6 }catch{ 7 print("error") 8 } 9 }) 10 task.resume()

このように書いて取得したデータは
{ kind : "...."
totalItems : 9,
items : [ { kind : "....", id : ".....", //いくつか続いていく ]
という形になっていました。
私はこのitemsの中にある特定のキーを持つ値を取り出し、テーブルビューに表示したいと考えているのですが、itemsをまたキャストすればいいのかと思い

Swift

1let items = json["items"] as! [String: Any] 2print(items)

というように一度記述してみましたが、

Could not cast value of type '__NSArrayI' (0x22da11a70) to 'NSDictionary' (0x22da10bc0).

といったエラーが出て来ました。
このエラーはどういう意味なのか、また、どのように記述すればitemsを取り扱えるようになるのか。
拙い文章で恐縮ですが、ご教示いただけると幸いです。

作業環境
MacOS High Sierra バージョン10.13.6
メモリ8GB
Xcode10.1
Swift4.2.1
ここまでの実装で参考にしたサイトはhttps://fukatsu.tech/api-tableview#i-5です。

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

items : [ { kind : "....", id : ".....", //いくつか続いていく ]

itemsは[String: Any]の配列になっているように見えますが。

エラーメッセージもそういう風に言ってますが。

Could not cast value of type '__NSArrayI' (0x22da11a70) to 'NSDictionary' (0x22da10bc0).

投稿2019/01/09 08:00

編集2019/01/09 08:02
fuzzball

総合スコア16731

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

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

yuyu_yuyui22

2019/01/09 08:25

回答ありがとうございます! print("dataType: (type(of: items))")と記述してコンソールで確認してみたら、[String: Any]になっていました。 この itemsは大きな塊で複数個あるのですが、その全ての要素(例えばthumbnailというキーを持つ値)を取り出したいのですが、どのように記述すればいいでしょうか? print("thumbnail: (items![0]["thumbnail"])") というように記述してみたところ Cannot subscript a value of type '[String : Any]' with an index of type 'Int' というように赤く表示されましたが、どのように改善したらいいのか、詰まってしまっています。 よろしければ、教えてくださると助かります。
fuzzball

2019/01/09 08:27

「[String: Any]でキャストしてるけど、間違ってるんじゃない?」って回答なんですけど、何を言っているのでしょうか?
yuyu_yuyui22

2019/01/09 10:25

色々やってみたところ、[String: Any]だと要素の指定?に整数が使えないような感じでした。 [String: Any]ではなく[Any]型にキャストしたら問題なく動きました。 let items = json["items"] as? [Any] print("items: (String(describing: items?[0]))") 複数個のitemsの塊のなかから共通したキーを持つ値を取り出すなら、繰り返し処理がいいのでしょうか。 詰まって居たキャストの問題は解決したと言っていいので、この質問はここで終わらせていただきます。 答えてくださりありがとうございました!ベストアンサーにさせていただきます。
fuzzball

2019/01/09 10:31

[String: Any]の配列 だから [[String: Any]] です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問