-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcodables.swift
95 lines (72 loc) · 2.17 KB
/
codables.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// Author: Scott Grivner
// Website: scottgrivner.dev
// Abstract:
// Introduced in Swift 4, the Codable API enables us to leverage the compiler in order to generate much of the code needed to encode and decode data to/from a serialized format, like JSON.
import Foundation
// Header Structure
struct Header: Decodable {
let current_language_code: String?
let current_language_name: String?
private enum CodingKeys: String, CodingKey {
case current_language_code = "current_language_code"
case current_language_name = "current_language_name"
}
}
// Details Structure
struct Details: Decodable {
let language_code: String?
let language_name: String?
enum CodingKeys: String, CodingKey {
case language_code = "language_code"
case language_name = "language_name"
}
}
// Root Structure
struct Root: Decodable {
let header: [Header]?
let details: [Details]?
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
header = try container.decode([Header].self, forKey: .header)
details = try container.decode([Details].self, forKey: .details)
}
enum CodingKeys: String, CodingKey {
case header
case details
}
}
// Declare JSON
let json = """
{
"header": [{
"current_language_code": "ru",
"current_language_name": "Russian (Test)"
}],
"details": [{
"language_code": "en",
"language_name": "English (English)"
}, {
"language_code": "ru",
"language_name": "Russian (Test)"
}]
}
"""
// Decode JSON
do {
let response = try
JSONDecoder().decode(Root.self, from: json.data(using: .utf8)!)
response.header?.forEach { h in
print(h)
print(h.current_language_code!)
print(h.current_language_name!)
}
response.details?.forEach { d in
print(d)
print(d.language_code!)
print(d.language_name!)
}
let languages = response.header
print(languages!)
} catch let jsonErr {
print ("Error serializing json: ", jsonErr)
}