Skip to content

Instantly share code, notes, and snippets.

@tylerjohnson10
Created June 13, 2017 15:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tylerjohnson10/5f5b8128d59b31641f197ea4f2e5f298 to your computer and use it in GitHub Desktop.
Save tylerjohnson10/5f5b8128d59b31641f197ea4f2e5f298 to your computer and use it in GitHub Desktop.
/* 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