Created
June 13, 2017 15:12
-
-
Save tylerjohnson10/5f5b8128d59b31641f197ea4f2e5f298 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Object Oriented Approach */ | |
// Conversion of Data to JSONObject | |
class Deserializer { | |
func deserialize(_ data: Data?) -> JSONObject? { | |
guard let data = data else { | |
return nil | |
} | |
do { | |
return try JSONObject(JSONSerialization.jsonObject(with: data, options: .allowFragments)) | |
} catch { | |
return nil | |
} | |
} | |
} | |
// Conversion of JSONObject to Model | |
protocol ModelDeserializerType { | |
associatedtype Deserializable | |
func model(fromJSONObject json: JSONObject?) -> Deserializable? | |
} | |
class ModelDeserializer<T>: ModelDeserializerType { | |
typealias Deserializable = T | |
var deserializer = Deserializer() | |
/** | |
Subclasses must override this method and provide an implementation. | |
*/ | |
func model(fromJSONObject json: JSONObject?) -> Deserializable? { | |
return nil | |
} | |
} | |
// Helper for decoding JSON | |
struct JSONDecoder { | |
private let dictionary: [String: Any] | |
init?(json: JSONObject?) { | |
guard let json = json, case .dictionary(let dictionary) = json else { return nil } | |
self.dictionary = dictionary | |
} | |
func decode<T>(key: String) -> T? { | |
guard let object = dictionary[key] as? T else { return nil } | |
return object | |
} | |
} | |
// Creating a User from a JSONObject | |
class UserDeserializer: ModelDeserializer<User> { | |
override func model(fromJSONObject json: JSONObject?) -> User? { | |
guard let decoder = JSONDecoder(json: json) else { | |
return nil | |
} | |
guard let firstName: String = decoder.decode(key: "FirstName") else { | |
return nil | |
} | |
let url = decoder.decode(key: "AvatarURL").flatMap(URL.init(string:)) | |
return User(avatarURL: url, firstName: firstName) | |
} | |
} | |
// Example Usage | |
let userJSON: [String: Any] = [ | |
"FirstName": "Tyler", | |
"AvatarURL": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3c/William_Howard_Taft_1909b.jpg/1200px-William_Howard_Taft_1909b.jpg" | |
] | |
let userData = try JSONSerialization.data(withJSONObject: userJSON, options: []) | |
let json = Deserializer().deserialize(userData) | |
let user: User? = UserDeserializer().model(fromJSONObject: json) | |
let imageData = try Data(contentsOf: user!.avatarURL!) | |
UIImageView(image: UIImage(data: imageData)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment