                 if object.responds(to: Selector(propertyKey)) {
                     let propertyClassName = propertyTypeStringForName(object, name: propertyKey)!
                     var isDeserialized = false
-                    for deserializer in self.deserializers! {
-                        let nameOfClass = deserializer.nameOfClass()
-                        if propertyClassName == nameOfClass {
-                            isDeserialized = true
-                            object.setValue(deserializer.valueForObject(json[key]!), forKey: propertyKey)
-                        }
+                    if let deserializer = deserializer(for: propertyClassName) {
+                        isDeserialized = true
+                        object.setValue(deserializer.valueForObject(json[key]!), forKey: propertyKey)
                     }
                     if !isDeserialized {
                         if let jsonValue = json[key] {
                             if jsonValue.isKind(of: NSDictionary.self) {
                                 if let mirror = propertyMirrorFor(object, name: propertyKey) {
+                                    var typeName: String? = String(describing: mirror.subjectType)
                                     if mirror.displayStyle == .optional {
-                                        let typeName = unwrappedClassName(String(describing: mirror.subjectType))
-                                        var mirrorClass = NSClassFromString(typeName!)
-                                        if mirrorClass == nil {
-                                            var appName = Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as! String
-                                            appName = appName.replacingOccurrences(of: " ", with: "_")
-                                            mirrorClass = NSClassFromString(appName + "." + typeName!)
-                                        }
-                                        let mirrorType: NSObject.Type = mirrorClass.self as! NSObject.Type
+                                        typeName = unwrappedClassName(typeName)
+                                    }
+                                    if typeName?.characters.count > 29 && (typeName?.substring(to: (typeName?.index((typeName?.startIndex)!, offsetBy: 29))!).contains("ImplicitlyUnwrappedOptional<"))! {
+                                        typeName = unwrappedImplicitClassName(typeName)
+                                    }
+                                    var mirrorClass = NSClassFromString(typeName!)
+                                    if mirrorClass == nil {
+                                        var appName = Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as! String
+                                        appName = appName.replacingOccurrences(of: " ", with: "_")
+                                        mirrorClass = NSClassFromString(appName + "." + typeName!)
+                                    }
+                                    let mirrorType: NSObject.Type = mirrorClass.self as! NSObject.Type
+                                    if mirrorType.init() is NSDictionary {
+                                        setValueOfObject(object, value: json[key]!, key: propertyKey)
+                                    }else{
                                         setValueOfObject(object, value: fromJsonDictionary(json[key] as? [String: AnyObject], clazz: mirrorType as! NSObject.Type)!, key: propertyKey)
-                                    }else{
-                                        setValueOfObject(object, value: fromJsonDictionary(json[key] as? [String: AnyObject], clazz: mirror.subjectType as! NSObject.Type)!, key: propertyKey)
                                     }
                                 }else{
                                     setValueOfObject(object, value: json[key]!, key: propertyKey)


import UIKit
fileprivate func < <T : Comparable>(lhs: T?, rhs: T?) -> Bool {
  switch (lhs, rhs) {
  case let (l?, r?):
    return l < r
  case (nil, _?):
    return true
  default:
    return false
  }
}

fileprivate func > <T : Comparable>(lhs: T?, rhs: T?) -> Bool {
  switch (lhs, rhs) {
  case let (l?, r?):
    return l > r
  default:
    return rhs < lhs
  }
}



        return unwrappedClassName
    }
    
    func unwrappedImplicitClassName(_ string: String?) -> String? {
        var unwrappedClassName: String? = string
        if string?.characters.count > 29 {
            if (string?.substring(to: (string?.characters.index((string?.startIndex)!, offsetBy: 28))!))! == "ImplicitlyUnwrappedOptional<" {
                unwrappedClassName = string?.substring(to: (string?.characters.index((string?.startIndex)!, offsetBy: (string?.characters.count)! - 1))!)
                unwrappedClassName = unwrappedClassName?.substring(from: (unwrappedClassName?.characters.index((unwrappedClassName?.startIndex)!, offsetBy: 28))!)
            }
        }
        return unwrappedClassName
    }
    
    func unwrappedArrayElementClassName(_ string: String?) -> String? {
        var unwrappedClassName: String? = string
        if string?.characters.count > 6 {
