Eta是一個使用Swift語言編寫的iOS開發(fā)框架,它提供了一種便捷、高效的方式來處理JSON數(shù)據(jù)。Eta自帶了一個名為JSONAbler的協(xié)議,通過實現(xiàn)這個協(xié)議可以使得對象具備將自身轉(zhuǎn)化為JSON格式的能力。而JSON接口則通過iOS系統(tǒng)自帶的NSJSONSerialization進(jìn)行轉(zhuǎn)換,并提供了便捷、安全的方法來完成JSON的序列化和反序列化。
protocol JSONAbler { func toJSON() ->Any init(json: Any) } extension JSONAbler { func toJSON() ->Any { let mirror = Mirror(reflecting: self) let dict = Dictionary(uniqueKeysWithValues: mirror.children.lazy.map { (label: String?, value: Any) ->(String, Any)? in guard let key = label else { return nil } return (key, value) }.compactMap { $0 }) return dict } init(json: Any) { if let dict = json as? [String: Any] { for case let (label?, _) in Mirror(reflecting: self).children { if let value = dict[label] { let valueType = Mirror(reflecting: value).subjectType if let v = value as? [String: Any], valueType is JSONAbler.Type { let newVal = (valueType as! JSONAbler.Type).init(json: v) self.setValue(newVal, forKey: label) } else if valueType is String.Type || valueType is Int.Type || valueType is Double.Type || valueType is Float.Type || valueType is Bool.Type { self.setValue(value, forKey: label) } } } } } }
可以看出,通過實現(xiàn)JSONAbler協(xié)議的對象可以通過toJSON()方法將自身轉(zhuǎn)成為一個Dictionary類型,而通過init(json: Any)方法可以反序列化JSON數(shù)據(jù)并將其賦值給對應(yīng)的對象屬性,這一切都可以方便地實現(xiàn)JSON數(shù)據(jù)的序列化和反序列化。