質問編集履歴

2

タイトルを修正

2019/09/29 08:40

投稿

syoco0330
syoco0330

スコア30

test CHANGED
@@ -1 +1 @@
1
- SWIFTでJSONデータを扱いたいです。
1
+ SWIFTでGooglebooksApiのJSONデータを格納したい
test CHANGED
File without changes

1

質問内容を詳細にしました。

2019/09/29 08:40

投稿

syoco0330
syoco0330

スコア30

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,5 @@
1
+ ### 実現したいこと
2
+
1
3
  本のISBN情報のJSONデータを格納したいのですが、nilで返されてしまいます。
2
4
 
3
5
  どこが間違っているかご指摘お願いできませんでしょうか?
@@ -6,134 +8,278 @@
6
8
 
7
9
  使用しているAPIはGoogleBooksApiです。
8
10
 
11
+ ```JSON
12
+
13
+ {
14
+
15
+ "kind": "books#volumes",
16
+
17
+ "totalItems": 1,
18
+
19
+ "items": [
20
+
21
+ {
22
+
23
+ "kind": "books#volume",
24
+
25
+ "id": "bhQ-jwEACAAJ",
26
+
27
+ "etag": "BmkCDpQSH+I",
28
+
9
- [JSONデータサンプル](https://www.googleapis.com/books/v1/volumes?q=isbn:9784801400207)です。
29
+ "selfLink": "https://www.googleapis.com/books/v1/volumes/bhQ-jwEACAAJ",
30
+
10
-
31
+ "volumeInfo": {
32
+
11
-
33
+ "title": "図解ワイン一年生",
34
+
12
-
35
+ "authors": [
36
+
13
-
37
+ "小久保尊"
38
+
14
-
39
+ ],
40
+
41
+ "publishedDate": "2015-12-01",
42
+
43
+ "description": "ワインが10倍楽しくなる!ワインをいつも“勘”で選んでいるあなたへ。下町の人気ソムリエが教える、世界一かんたんなワインの教科書。ワインに関する素朴な疑問をすべて解決します。",
44
+
45
+ "industryIdentifiers": [
46
+
47
+ {
48
+
49
+ "type": "ISBN_10",
50
+
51
+ "identifier": "4801400205"
52
+
53
+ },
54
+
55
+ {
56
+
57
+ "type": "ISBN_13",
58
+
59
+ "identifier": "9784801400207"
60
+
61
+ }
62
+
63
+ ],
64
+
65
+ "readingModes": {
66
+
67
+ "text": false,
68
+
69
+ "image": false
70
+
71
+ },
72
+
73
+ "pageCount": 277,
74
+
75
+ "printType": "BOOK",
76
+
77
+ "maturityRating": "NOT_MATURE",
78
+
79
+ "allowAnonLogging": false,
80
+
81
+ "contentVersion": "preview-1.0.0",
82
+
83
+ "imageLinks": {
84
+
85
+ "smallThumbnail": "http://books.google.com/books/content?id=bhQ-jwEACAAJ&printsec=frontcover&img=1&zoom=5&source=gbs_api",
86
+
87
+ "thumbnail": "http://books.google.com/books/content?id=bhQ-jwEACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api"
88
+
89
+ },
90
+
91
+ "language": "ja",
92
+
93
+ "previewLink": "http://books.google.co.jp/books?id=bhQ-jwEACAAJ&dq=isbn:9784801400207&hl=&cd=1&source=gbs_api",
94
+
95
+ "infoLink": "http://books.google.co.jp/books?id=bhQ-jwEACAAJ&dq=isbn:9784801400207&hl=&source=gbs_api",
96
+
97
+ "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"
98
+
99
+ },
100
+
101
+ "saleInfo": {
102
+
103
+ "country": "JP",
104
+
105
+ "saleability": "NOT_FOR_SALE",
106
+
107
+ "isEbook": false
108
+
109
+ },
110
+
111
+ "accessInfo": {
112
+
113
+ "country": "JP",
114
+
115
+ "viewability": "NO_PAGES",
116
+
117
+ "embeddable": false,
118
+
119
+ "publicDomain": false,
120
+
121
+ "textToSpeechPermission": "ALLOWED",
122
+
123
+ "epub": {
124
+
125
+ "isAvailable": false
126
+
127
+ },
128
+
129
+ "pdf": {
130
+
131
+ "isAvailable": false
132
+
133
+ },
134
+
135
+ "webReaderLink": "http://play.google.com/books/reader?id=bhQ-jwEACAAJ&hl=&printsec=frontcover&source=gbs_api",
136
+
137
+ "accessViewStatus": "NONE",
138
+
139
+ "quoteSharingAllowed": false
140
+
141
+ },
142
+
143
+ "searchInfo": {
144
+
145
+ "textSnippet": "ワインが10倍楽しくなる!ワインをいつも“勘”で選んでいるあなたへ。下町の人気ソムリエが教える、世界一かんたんなワインの教科書。ワインに関する素朴な疑問をすべて解決 ..."
146
+
147
+ }
148
+
149
+ }
150
+
151
+ ]
152
+
153
+ }
154
+
155
+ ```
156
+
157
+
158
+
159
+
160
+
161
+
162
+
15
- ```返ってくる値
163
+ ```swift
164
+
165
+ // JSONのItem内のデータ構造
166
+
167
+ struct ItemJson: Codable {
168
+
169
+ // 本の名称
170
+
171
+ let title: String?
172
+
173
+ // 著者
174
+
175
+ let authors: String?
176
+
177
+ let smallThumbnail: URL?
178
+
179
+ }
180
+
181
+
182
+
183
+ // JSONのデータ構造
184
+
185
+ struct ResultJson: Codable {
186
+
187
+ // 複数要素
188
+
189
+ let items:[ItemJson]?
190
+
191
+ }
192
+
193
+
194
+
195
+
196
+
197
+ // 第一引数:keyword 検索したいワード
198
+
199
+ func searchBook(keyword : String) {
200
+
201
+ // 本のISBN情報をURLエンコードする
202
+
203
+ guard let keyword_encode = keyword.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {
204
+
205
+ return
206
+
207
+ }
208
+
209
+
210
+
211
+ // リクエストURLの組み立て
212
+
213
+ guard let req_url = URL(string: "https://www.googleapis.com/books/v1/volumes?q=isbn:(keyword)") else {
214
+
215
+ return
216
+
217
+ }
218
+
219
+ print(req_url)
220
+
221
+
222
+
223
+ // リクエストに必要な情報を生成
224
+
225
+ let req = URLRequest(url: req_url)
226
+
227
+ // データ転送を管理するためのセッションを生成
228
+
229
+ let session = URLSession(configuration: .default, delegate: nil, delegateQueue: OperationQueue.main)
230
+
231
+ // リクエストをタスクとして登録
232
+
233
+ let task = session.dataTask(with: req, completionHandler: {
234
+
235
+ (data , response , error) in
236
+
237
+ // セッションを終了
238
+
239
+ session.finishTasksAndInvalidate()
240
+
241
+ // do try catch エラーハンドリング
242
+
243
+ do {
244
+
245
+ //JSONDecoderのインスタンス取得
246
+
247
+ let decoder = JSONDecoder()
248
+
249
+ // 受け取ったJSONデータをパース(解析)して格納
250
+
251
+ let json = try decoder.decode(ResultJson.self, from: data!)
252
+
253
+ print(json)
254
+
255
+
256
+
257
+ } catch {
258
+
259
+ // エラー処理
260
+
261
+ print("エラー?")
262
+
263
+ print(error)
264
+
265
+ }
266
+
267
+ })
268
+
269
+ // ダウンロード開始
270
+
271
+ task.resume()
272
+
273
+ }
274
+
275
+ ```
276
+
277
+
278
+
279
+ 戻り値が下記のようになってしまいます。
280
+
281
+ ```
16
282
 
17
283
  ResultJson(items: Optional([Habit.CameraViewController.ItemJson(title: nil, authors: nil, smallThumbnail: nil)]))
18
284
 
19
285
  ```
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
- ```swift
28
-
29
- // JSONのItem内のデータ構造
30
-
31
- struct ItemJson: Codable {
32
-
33
- // 本の名称
34
-
35
- let title: String?
36
-
37
- // 著者
38
-
39
- let authors: String?
40
-
41
- let smallThumbnail: URL?
42
-
43
- }
44
-
45
-
46
-
47
- // JSONのデータ構造
48
-
49
- struct ResultJson: Codable {
50
-
51
- // 複数要素
52
-
53
- let items:[ItemJson]?
54
-
55
- }
56
-
57
-
58
-
59
-
60
-
61
- // 第一引数:keyword 検索したいワード
62
-
63
- func searchBook(keyword : String) {
64
-
65
- // 本のISBN情報をURLエンコードする
66
-
67
- guard let keyword_encode = keyword.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {
68
-
69
- return
70
-
71
- }
72
-
73
-
74
-
75
- // リクエストURLの組み立て
76
-
77
- guard let req_url = URL(string: "https://www.googleapis.com/books/v1/volumes?q=isbn:(keyword)") else {
78
-
79
- return
80
-
81
- }
82
-
83
- print(req_url)
84
-
85
-
86
-
87
- // リクエストに必要な情報を生成
88
-
89
- let req = URLRequest(url: req_url)
90
-
91
- // データ転送を管理するためのセッションを生成
92
-
93
- let session = URLSession(configuration: .default, delegate: nil, delegateQueue: OperationQueue.main)
94
-
95
- // リクエストをタスクとして登録
96
-
97
- let task = session.dataTask(with: req, completionHandler: {
98
-
99
- (data , response , error) in
100
-
101
- // セッションを終了
102
-
103
- session.finishTasksAndInvalidate()
104
-
105
- // do try catch エラーハンドリング
106
-
107
- do {
108
-
109
- //JSONDecoderのインスタンス取得
110
-
111
- let decoder = JSONDecoder()
112
-
113
- // 受け取ったJSONデータをパース(解析)して格納
114
-
115
- let json = try decoder.decode(ResultJson.self, from: data!)
116
-
117
- print(json)
118
-
119
-
120
-
121
- } catch {
122
-
123
- // エラー処理
124
-
125
- print("エラー?")
126
-
127
- print(error)
128
-
129
- }
130
-
131
- })
132
-
133
- // ダウンロード開始
134
-
135
- task.resume()
136
-
137
- }
138
-
139
- ```