質問編集履歴

2

コードを掲載したurlを記載

2019/10/06 04:39

投稿

hironante
hironante

スコア8

test CHANGED
File without changes
test CHANGED
@@ -19,3 +19,9 @@
19
19
 
20
20
 
21
21
  コードが書ききれないので別urlで用意します。
22
+
23
+
24
+
25
+ コードは下記のurlとなります。
26
+
27
+ [https://hiroslog.com/page-332](https://hiroslog.com/page-332)

1

文字入力制限があるため別サイトでコードを掲載

2019/10/06 04:39

投稿

hironante
hironante

スコア8

test CHANGED
File without changes
test CHANGED
@@ -18,320 +18,4 @@
18
18
 
19
19
 
20
20
 
21
- Yahoo ショッピングapi
22
-
23
- ```json
24
-
25
- {
26
-
27
- "ResultSet": {
28
-
29
- "0": {
30
-
31
- "Result": {
32
-
33
- "0": {
34
-
35
- "Name": "swift ブレーキパッド ≪type-SP (リアシュー)≫ 【bB [NCP31/NCP35(4WD)] 1500 ’00.1〜04.10】",
36
-
37
- "Description": "swift スウィフト スイフト ブレーキ ブレーキシュー シュー リヤシュー スーパースポーツ typeSP",
38
-
39
- "Headline": "スウィフトSuperSports リア用 左右セット",
40
-
41
- "Url": "https://store.shopping.yahoo.co.jp/auto-craft/swift-sp-r00059.html",
42
-
43
- "ReleaseDate": "",
44
-
45
- "Availability": "instock",
46
-
47
- "Code": "auto-craft_swift-sp-r00059",
48
-
49
- "Condition": "new",
50
-
51
- "Image": {
52
-
53
- "Id": "",
54
-
55
- "Small": "https://s.yimg.jp/images/sh/noimage/76x76.gif",
56
-
57
- "Medium": "https://s.yimg.jp/images/sh/noimage/146x146.gif"
58
-
59
- },
60
-
61
- "Review": {
62
-
63
- "Rate": "0.00",
64
-
65
- "Count": "0",
66
-
67
- "Url": "https://shopping.yahoo.co.jp/review/item/list?store_id=auto-craft&page_key=swift-sp-r00059"
68
-
69
- },
70
-
71
- "Affiliate": {
72
-
73
- "Rate": "1.0"
74
-
75
- },
76
-
77
- "Price": {
78
-
79
- "_attributes": {
80
-
81
- "currency": "JPY"
82
-
83
- },
84
-
85
- "_value": "11880"
86
-
87
- },
88
-
89
- "PremiumPrice": "",
90
-
91
-
92
-
93
- },
94
-
95
-
96
-
97
-
98
-
99
-
100
-
101
- (省略)
102
-
103
-
104
-
105
-
106
-
107
-
108
-
109
- "19": {
110
-
111
- (省略)
112
-
113
-
114
-
115
- },
116
-
117
- "Request": {
118
-
119
- "Query": "swift"
120
-
121
- },
122
-
123
- "Modules": "",
124
-
125
- "_container": "Hit"
126
-
127
- }
128
-
129
- },
130
-
131
- "totalResultsAvailable": "252014",
132
-
133
- "totalResultsReturned": 20,
134
-
135
- "firstResultPosition": "4"
136
-
137
- }
138
-
139
- }
140
-
141
- ```
142
-
143
-
144
-
145
- ItemSearchResultSet.swift
146
-
147
- ```swift
148
-
149
- import Foundation
150
-
151
-
152
-
153
- // 検索結果全体を格納するクラス
154
-
155
- class ItemSearchResultSet: Codable {
156
-
157
- var resultSet: ResultSet
158
-
159
- private enum CodingKeys: String, CodingKey {
160
-
161
- case resultSet = "ResultSet"
162
-
163
- }
164
-
165
- }
166
-
167
- // 検索結果セット格納クラス
168
-
169
- class ResultSet: Codable {
170
-
171
- var firstObject: FirstObject
172
-
173
-
174
-
175
- private enum CodingKeys: String, CodingKey {
176
-
177
- case firstObject = "0"
178
-
179
- }
180
-
181
- }
182
-
183
- // 検索結果の先頭を格納するクラス
184
-
185
- class FirstObject: Codable {
186
-
187
- var result: Result
188
-
189
- var totalResultsAvailable: String = "" // 自分で追加したコード
190
-
191
- private enum CodingKeys: String, CodingKey {
192
-
193
- case result = "Result"
194
-
195
- }
196
-
197
- }
198
-
199
-
200
-
201
-
202
-
203
- // 検索結果格納クラス
204
-
205
- class Result: Codable {
206
-
207
- var items: [ItemData] = [ItemData]()
208
-
209
- required init(from decoder: Decoder) throws {
210
-
211
- // デコードのためのコンテナを取得
212
-
213
- let container = try decoder.container(keyedBy: CodingKeys.self)
214
-
215
- // コンテナ内のキーを取得。キーが文字列であるため、数値の昇順でソートも行う
216
-
217
- let keys = container.allKeys.sorted {
218
-
219
- Int($0.rawValue)! < Int($1.rawValue)!
220
-
221
- }
222
-
223
- // キーを使用して検索結果を一件ずつ取り出す
224
-
225
- for key in keys {
226
-
227
- // 検索結果一件に対するデコード処理
228
-
229
- let item = try container.decode(ItemData.self, forKey: key)
230
-
231
- // デコード処理できたら検索結果の一覧に追加
232
-
233
- items.append(item)
234
-
235
- }
236
-
237
-
238
-
239
- }
240
-
241
- // エンコード処理
242
-
243
- func encode(to encoder: Encoder) throws {
244
-
245
- // レスポンスを解析するだけなので、実装不要
246
-
247
- }
248
-
249
- // Resultクラスが持つ値を取得するためのキー
250
-
251
- private enum CodingKeys: String, CodingKey {
252
-
253
- case hit0 = "0"
254
-
255
- case hit1 = "1"
256
-
257
- (省略)
258
-
259
- case hit20 = "20"
260
-
261
- }
262
-
263
- }
264
-
265
-
266
-
267
- // 商品情報格納クラス
268
-
269
- class ItemData: Codable {
270
-
271
- // 商品名
272
-
273
- var name: String = ""
274
-
275
- // 商品URL
276
-
277
- var url: String = ""
278
-
279
- // 商品画像情報
280
-
281
- class ImageInfo: Codable {
282
-
283
- // Imageクラスが持つ値を取得するためのキー
284
-
285
- private enum CodingKeys: String, CodingKey {
286
-
287
- case medium = "Medium"
288
-
289
- }
290
-
291
- // 商品画像URL
292
-
293
- var medium: String?
294
-
295
- }
296
-
297
- // 商品画像URL
298
-
299
- var imageInfo: ImageInfo = ImageInfo()
300
-
301
- // 価格情報
302
-
303
- class PriceInfo: Codable {
304
-
305
- // Priceクラスが持つ値を取得するためのキー
306
-
307
- private enum CodingKeys: String, CodingKey {
308
-
309
- case price = "_value"
310
-
311
- }
312
-
313
- // 価格
314
-
315
- var price: String?
316
-
317
- }
318
-
319
- // 価格
320
-
321
- var priceInfo: PriceInfo = PriceInfo()
322
-
323
- private enum CodingKeys: String, CodingKey {
324
-
325
- case name = "Name"
326
-
327
- case url = "Url"
21
+ コードが書ききれないので別urlで用意します。
328
-
329
- case imageInfo = "Image"
330
-
331
- case priceInfo = "Price"
332
-
333
- }
334
-
335
- }
336
-
337
- ```