🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JSON

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

Swift

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

2447閲覧

SWIFTでGooglebooksApiのJSONデータを格納したい

syoco0330

総合スコア30

JSON

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

Swift

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2019/09/29 06:52

編集2019/09/29 08:40

実現したいこと

本のISBN情報のJSONデータを格納したいのですが、nilで返されてしまいます。
どこが間違っているかご指摘お願いできませんでしょうか?

使用しているAPIはGoogleBooksApiです。

JSON

1{ 2 "kind": "books#volumes", 3 "totalItems": 1, 4 "items": [ 5 { 6 "kind": "books#volume", 7 "id": "bhQ-jwEACAAJ", 8 "etag": "BmkCDpQSH+I", 9 "selfLink": "https://www.googleapis.com/books/v1/volumes/bhQ-jwEACAAJ", 10 "volumeInfo": { 11 "title": "図解ワイン一年生", 12 "authors": [ 13 "小久保尊" 14 ], 15 "publishedDate": "2015-12-01", 16 "description": "ワインが10倍楽しくなる!ワインをいつも“勘”で選んでいるあなたへ。下町の人気ソムリエが教える、世界一かんたんなワインの教科書。ワインに関する素朴な疑問をすべて解決します。", 17 "industryIdentifiers": [ 18 { 19 "type": "ISBN_10", 20 "identifier": "4801400205" 21 }, 22 { 23 "type": "ISBN_13", 24 "identifier": "9784801400207" 25 } 26 ], 27 "readingModes": { 28 "text": false, 29 "image": false 30 }, 31 "pageCount": 277, 32 "printType": "BOOK", 33 "maturityRating": "NOT_MATURE", 34 "allowAnonLogging": false, 35 "contentVersion": "preview-1.0.0", 36 "imageLinks": { 37 "smallThumbnail": "http://books.google.com/books/content?id=bhQ-jwEACAAJ&printsec=frontcover&img=1&zoom=5&source=gbs_api", 38 "thumbnail": "http://books.google.com/books/content?id=bhQ-jwEACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api" 39 }, 40 "language": "ja", 41 "previewLink": "http://books.google.co.jp/books?id=bhQ-jwEACAAJ&dq=isbn:9784801400207&hl=&cd=1&source=gbs_api", 42 "infoLink": "http://books.google.co.jp/books?id=bhQ-jwEACAAJ&dq=isbn:9784801400207&hl=&source=gbs_api", 43 "canonicalVolumeLink": "https://books.google.com/books/about/%E5%9B%B3%E8%A7%A3%E3%83%AF%E3%82%A4%E3%83%B3%E4%B8%80%E5%B9%B4%E7%94%9F.html?hl=&id=bhQ-jwEACAAJ" 44 }, 45 "saleInfo": { 46 "country": "JP", 47 "saleability": "NOT_FOR_SALE", 48 "isEbook": false 49 }, 50 "accessInfo": { 51 "country": "JP", 52 "viewability": "NO_PAGES", 53 "embeddable": false, 54 "publicDomain": false, 55 "textToSpeechPermission": "ALLOWED", 56 "epub": { 57 "isAvailable": false 58 }, 59 "pdf": { 60 "isAvailable": false 61 }, 62 "webReaderLink": "http://play.google.com/books/reader?id=bhQ-jwEACAAJ&hl=&printsec=frontcover&source=gbs_api", 63 "accessViewStatus": "NONE", 64 "quoteSharingAllowed": false 65 }, 66 "searchInfo": { 67 "textSnippet": "ワインが10倍楽しくなる!ワインをいつも“勘”で選んでいるあなたへ。下町の人気ソムリエが教える、世界一かんたんなワインの教科書。ワインに関する素朴な疑問をすべて解決 ..." 68 } 69 } 70 ] 71}

swift

1 // JSONのItem内のデータ構造 2 struct ItemJson: Codable { 3 // 本の名称 4 let title: String? 5 // 著者 6 let authors: String? 7 let smallThumbnail: URL? 8 } 9 10 // JSONのデータ構造 11 struct ResultJson: Codable { 12 // 複数要素 13 let items:[ItemJson]? 14 } 15 16 17 // 第一引数:keyword 検索したいワード 18 func searchBook(keyword : String) { 19 // 本のISBN情報をURLエンコードする 20 guard let keyword_encode = keyword.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { 21 return 22 } 23 24 // リクエストURLの組み立て 25 guard let req_url = URL(string: "https://www.googleapis.com/books/v1/volumes?q=isbn:(keyword)") else { 26 return 27 } 28 print(req_url) 29 30 // リクエストに必要な情報を生成 31 let req = URLRequest(url: req_url) 32 // データ転送を管理するためのセッションを生成 33 let session = URLSession(configuration: .default, delegate: nil, delegateQueue: OperationQueue.main) 34 // リクエストをタスクとして登録 35 let task = session.dataTask(with: req, completionHandler: { 36 (data , response , error) in 37 // セッションを終了 38 session.finishTasksAndInvalidate() 39 // do try catch エラーハンドリング 40 do { 41 //JSONDecoderのインスタンス取得 42 let decoder = JSONDecoder() 43 // 受け取ったJSONデータをパース(解析)して格納 44 let json = try decoder.decode(ResultJson.self, from: data!) 45 print(json) 46 47 } catch { 48 // エラー処理 49 print("エラー?") 50 print(error) 51 } 52 }) 53 // ダウンロード開始 54 task.resume() 55 }

戻り値が下記のようになってしまいます。

ResultJson(items: Optional([Habit.CameraViewController.ItemJson(title: nil, authors: nil, smallThumbnail: nil)]))

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

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

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

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

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

guest

回答2

0

自己解決

JSONのデータの構造と、デコーダが合っていないことが原因でした。

swift

1 // imageLinkのデータ構造 2 struct ImageLinkJson: Codable { 3 let smallThumbnail: URL? 4 } 5 // JSONのItem内のデータ構造 6 struct VolumeInfoJson: Codable { 7 // 本の名称 8 let title: String? 9 // 著者 10 let authors: [String]? 11 // 本の画像 12 let imageLinks: ImageLinkJson? 13 } 14 // Jsonのitem内のデータ構造 15 struct ItemJson: Codable { 16 let volumeInfo: VolumeInfoJson? 17 } 18 19 // JSONのデータ構造 20 struct ResultJson: Codable { 21 // 複数要素 22 let kind: String? 23 let totalItems: Int? 24 let items: [ItemJson]? 25 }

投稿2019/09/29 12:19

syoco0330

総合スコア30

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

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

0

JSONのデータの構造と、デコーダが合っていないようです。次のように変更してみてはいかがでしょうか?

// VolumeInfo内のデータ構造 struct VolumeInfoJson: Codable { // 本の名称 let title: String? // 著者 let authors: [String]? let smallThumbnail: URL? } // JSONのItem内のデータ構造 struct ItemJson: Codable { let volumeInfo: VolumeInfoJson? } // JSONのデータ構造 struct ResultJson: Codable { // 複数要素 let kind: String? let totalItems: Int? let items:[ItemJson]? }

投稿2019/09/29 09:15

KNaito

総合スコア376

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

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

syoco0330

2019/09/29 11:04 編集

ありがとうございます。 ご教授いただいたコードでビルドしたところ 下記のような結果が返ってきました。 ResultJson(kind: Optional("books#volumes"), totalItems: Optional(1), items: Optional([Habit.CameraViewController.ItemJson(volumeInfo: Optional(Habit.CameraViewController.VolumeInfoJson(title: Optional("図解ワイン一年生"), authors: Optional(["小久保尊"]), smallThumbnail: nil)))])) smallThumbnailの部分がnilになってしまうので当方で改めて調べてみたいと思います。もしご存知でしたら、ご教授いただけませんでしょうか。
KNaito

2019/09/29 12:09 編集

おっとすみません。Thumbnail系は、さらにもう一階層あるんですね。では、 ``` // ImageLinkのデータ構造 struct ImageLinkJson: Codable { let smallThumbnail: URL? } // VolumeInfo内のデータ構造 struct VolumeInfoJson: Codable { // 本の名称 let title: String? // 著者 let authors: [String]? let imageLinks: ImageLinkJson? } // JSONのItem内のデータ構造 struct ItemJson: Codable { let volumeInfo: VolumeInfoJson? } // JSONのデータ構造 struct ResultJson: Codable { // 複数要素 let kind: String? let totalItems: Int? let items:[ItemJson]? } ``` でいかがでしょうか?
syoco0330

2019/09/29 12:18

実現できました。助かりました。 コメントに対するお返事までいただき本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問