/
JSONObject.swift
203 lines (168 loc) · 5.6 KB
/
JSONObject.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
//
// JSONObject.swift
// Anemone SDK
//
// Created by Angel Garcia on 17/01/2017.
// Copyright © 2017 Syltek Solutions S.L. All rights reserved.
//
import Foundation
public class JSONObject {
var data: [String: Any]
init() {
data = [:]
}
init(data: [String: Any]) {
self.data = data
}
public convenience init(string: String) throws {
guard let data = string.data(using: .utf8) else {
throw AnemoneException.jsonInvalidFormat
}
try self.init(data: data)
}
public convenience init(data: Data) throws {
guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else {
throw AnemoneException.jsonInvalidFormat
}
self.init(data: json)
}
public func has(_ key: String) -> Bool {
return data[key] != nil && !(data[key] is NSNull)
}
public func getAny(_ key: String) throws -> Any {
guard let value = data[key] else {
throw AnemoneException.jsonInvalidFormat
}
return value
}
public func getInt(_ key: String) throws -> Int {
guard let value = data[key] as? Int else {
throw AnemoneException.jsonInvalidFormat
}
return value
}
public func getDouble(_ key: String) throws -> Double {
guard let value = data[key] as? Double else {
throw AnemoneException.jsonInvalidFormat
}
return value
}
public func getBoolean(_ key: String) throws -> Bool {
guard let value = data[key] as? Bool else {
throw AnemoneException.jsonInvalidFormat
}
return value
}
public func optBoolean(_ key: String) -> Bool? {
return try? getBoolean(key)
}
public func getString(_ key: String) throws -> String {
guard let value = data[key] as? String else {
throw AnemoneException.jsonInvalidFormat
}
return value
}
public func optString(_ key: String) -> String? {
return try? getString(key)
}
public func getDate(_ key: String) throws -> Date {
guard let value = data[key] as? String else {
throw AnemoneException.jsonInvalidFormat
}
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
dateFormatter.timeZone = TimeZone.utc
guard let date = dateFormatter.date(from: value) else {
throw AnemoneException.jsonInvalidFormat
}
return date
}
public func optDate(_ key: String) -> Date? {
return try? getDate(key)
}
public func getJSONObject(_ key: String) throws -> JSONObject {
guard let value = data[key] as? [String: Any] else {
throw AnemoneException.jsonInvalidFormat
}
return JSONObject(data: value)
}
public func optJSONObject(_ key: String) -> JSONObject? {
return try? getJSONObject(key)
}
public func getJSONArray(_ key: String) throws -> JSONArray {
guard let value = data[key] as? [Any] else {
throw AnemoneException.jsonInvalidFormat
}
return JSONArray(data: value)
}
public func getStringArray(_ key: String) throws -> [String] {
guard let value = data[key] as? [String] else {
throw AnemoneException.jsonInvalidFormat
}
return value
}
public func getIntArray(_ key: String) throws -> [Int] {
guard let value = data[key] as? [Int] else {
throw AnemoneException.jsonInvalidFormat
}
return value
}
public func getAnyArray(_ key: String) throws -> [Any] {
guard let value = data[key] as? [Any] else {
throw AnemoneException.jsonInvalidFormat
}
return value
}
public func asMap() -> [String: Any] {
return data
}
public func setAny(_ key: String, _ value: Any?) {
data[key] = value
}
public func setInt(_ key: String, _ value: Int?) {
data[key] = value
}
public func setDouble(_ key: String, _ value: Double?) {
data[key] = value
}
public func setString(_ key: String, _ value: String?) {
data[key] = value
}
public func setBoolean(_ key: String, _ value: Bool?) {
data[key] = value
}
public func setObject(_ key: String, _ value: JSONObject?) {
data[key] = value?.data
}
public func setArray(_ key: String, _ value: [Any]?) {
data[key] = value
}
public func setJSONArray(_ key: String, _ value: JSONArray?) {
data[key] = value?.data
}
public func setDate(_ key: String, _ value: Date?) {
guard let value = value else {
data[key] = nil
return
}
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
dateFormatter.timeZone = TimeZone.utc
data[key] = dateFormatter.string(from: value)
}
public func toData() throws -> Data {
guard let jsonData = try? JSONSerialization.data(withJSONObject: data, options: []) else {
throw AnemoneException.jsonInvalidFormat
}
return jsonData
}
public func toString() throws -> String {
let jsonData = try toData()
guard let jsonString = String(data: jsonData, encoding: .utf8) else {
throw AnemoneException.jsonInvalidFormat
}
return jsonString.replacingOccurrences(of: "\\/", with: "/")
}
}