teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

Codableの勉強してきました。

2018/03/01 01:53

投稿

fuzzball
fuzzball

スコア16733

answer CHANGED
@@ -1,1 +1,97 @@
1
+ # 定義
2
+
3
+ おかしかったのは、配列のことが考えられていないのと、`TestInfoLink.id`がIntになっていたこと、ぐらいかな。
4
+
5
+ ```swift
6
+ struct Test: Codable {
7
+
8
+ var id: Int
9
+ var title: Rendered
10
+ var info: TestInfo
11
+
12
+ struct Rendered: Codable {
13
+ var rendered: String
14
+ }
15
+
16
+ struct TestInfo: Codable {
17
+ var mediaUrl: [TestInfoMedia]
18
+ var linkUrl: [[TestInfoLink]]
19
+
20
+ enum CodingKeys: String, CodingKey {
21
+ case mediaUrl = "test:mediaUrl"
22
+ case linkUrl = "test:linkUrl"
23
+ }
24
+ }
25
+
26
+ struct TestInfoMedia: Codable {
27
+ var source_url: String
28
+ }
29
+
30
+ struct TestInfoLink: Codable {
31
+ var id: Int
32
+ var name: String
33
+ }
34
+
35
+ }
36
+ ```
37
+
38
+ # テスト
39
+
40
+ ```swift
41
+ let stringJson = """
42
+ {
43
+ "id": 1,
44
+ "title": {"rendered": "hogehoge"},
45
+ "info": {
46
+ "test:mediaUrl": [
47
+ {"source_url": "http://example.com/hoge.jpg"},
48
+ {"source_url": "http://example.com/hogehoge.jpg"},
49
+ ],
50
+ "test:linkUrl": [
51
+ [
52
+ {"id": 1, "name": "http://example.com/?page=1"},
53
+ {"id": 2, "name": "http://example.com/?page=2"},
54
+ ], [
55
+ {"id": 3, "name": "http://example.com/?page=3"},
56
+ ],
57
+ ]
58
+ }
59
+ }
60
+ """
61
+
62
+ if let data = stringJson.data(using: .utf8) {
63
+ if let json = try? JSONDecoder().decode(Test.self, from: data) {
64
+ print("id=(json.id)")
65
+ print("title.rendered=\"(json.title.rendered)\"")
66
+ print("[mediaUrl]")
67
+ json.info.mediaUrl.enumerated().forEach {
68
+ print("#($0.0) source_url=\"($0.1.source_url)\"")
69
+ }
70
+ print("[linkUrl]")
71
+ json.info.linkUrl.enumerated().forEach {
72
+ print("#($0.0)")
73
+ $0.1.enumerated().forEach {
74
+ print("\t#($0.0) id=($0.1.id), name=\"($0.1.name)\"")
75
+ }
76
+ }
1
- (deleted)
77
+ } else {
78
+ print("decoding error")
79
+ }
80
+ }
81
+ ```
82
+
83
+ ## テスト結果
84
+
85
+ ```
86
+ id=1
87
+ title.rendered="hogehoge"
88
+ [mediaUrl]
89
+ #0 source_url="http://example.com/hoge.jpg"
90
+ #1 source_url="http://example.com/hogehoge.jpg"
91
+ [linkUrl]
92
+ #0
93
+ #0 id=1, name="http://example.com/?page=1"
94
+ #1 id=2, name="http://example.com/?page=2"
95
+ #1
96
+ #0 id=3, name="http://example.com/?page=3"
97
+ ```

1

全然ダメでした。

2018/03/01 01:53

投稿

fuzzball
fuzzball

スコア16733

answer CHANGED
@@ -1,10 +1,1 @@
1
- Codableのことは知りませんが、後半のコードが struct Test の外にあるなら、
2
-
3
- ```swift
4
- truct TestInfo: Codable {
5
- var mediaUrl: Test.TestInfoMedia
6
- var linkUrl: Test.TestInfoLink
7
- }
8
- ```
9
-
10
- でエラーは消えます。
1
+ (deleted)