| 测试测试通过 | ✓ |
| Lang语言 | SwiftSwift |
| 许可 | MIT |
| 发布最后发布 | 2017年9月 |
| SwiftSwift 版本 | 3.0 |
| SPM支持 SPM | ✗ |
由 Elliot Schrock 和 Elliot Schrock 维护。
Eson 是在 Swift 中获取 JSON 序列化和反序列化的最简单方法之一。
Eson 允许您将任何类型的类序列化到 JSON 字典中,并将 JSON 反序列化为任何 NSObject (现在还包括嵌套的 NSObject!)。
它会在您指定的情况下自动在 llamaCase 属性名称和 snake_case_json_keys 之间转换
您可以通过实现 EsonKeyMapper 协议轻松地为您的类属性设置不同的 JSON 键。例如,如果 json 对象包含一个键 id,您可以很容易地将该值放入一个名为 objectId 的属性中,反之亦然。
您可以为自定义类注册自己的序列化和反序列化器
要运行测试,请克隆仓库,并首先从 Example 目录运行 pod install。
要将对象序列化为 JSON 字典,只需构造一个 Eson 示例并对其调用的 toJsonDictionary。
let neo = Human.generateNeo()
let eson = Eson()
let optionalJson = eson.toJsonDictionary(neo)请参阅 SerializationTest.swift 获取更详细的示例。
要从 JSON 字典反序列化对象,构造一个 Eson 示例并在其上调用 fromJsonDictionary。
let json = ["name":"Neo","title":"The One","id":1]
let eson = Eson()
let neo = eson.fromJsonDictionary(json as? [String : AnyObject], clazz: Human.self)!要注册自定义反序列化器,构造一个 Eson 示例,并在其 deserializers 上附加一个自定义反序列化器
let shipJson = ["id":1001,"name":"Nebuchadnezzar"]
let json = ["name":"Neo","title":"The One","id":1,"ship":shipJson]
let eson = Eson()
eson.deserializers?.append(HumanShipDeserializer())
let neo = eson.fromJsonDictionary(json as? [String : AnyObject], clazz: Human.self)!其中 HumanShipDeserializer 实现了两个函数,nameOfClass 和 valueForObject
public class HumanShipDeserializer: Deserializer {
public func nameOfClass() -> String {
return "HumanShip"
}
public func valueForObject(object: AnyObject) -> AnyObject? {
let eson = Eson()
let ship = eson.fromJsonDictionary(object as? [String : AnyObject], clazz: HumanShip.self)!
return ship
}
}要在对象的 JSON 名称和属性名称之间互相转换,您只需实现一个名为 EsonKeyMapper 的协议,它有一个名为 esonPropertyNameToKeyMap 的方法。例如
public class ServerObject: NSObject, EsonKeyMapper {
var objectId: Int?
public static func esonPropertyNameToKeyMap() -> [String : String] {
return ["objectId":"id"]
}
}当 Eson 检测到嵌套对象时会递归调用自己。不幸的是,它只能在它们属于应用程序的主要包时检测嵌套对象。因此,如果您正在使用来自其他包的类,您将不得不为它们注册单个反序列化器(就像在旧版本中一样)。
您不能反序列化定义中包含泛型的类。例如
class JsonApiDataObject<T>: NSObject {
var attributes: T?
}将始终以attributes等于nil的方式进行反序列化。
NSObject。更重要的是,您的类中无法用Objective-C表示的任何属性(例如,Int?和Bool!无法在Obj-C中表示,因为在该语言中,int不是一个指针,因此它不可能是nil,类似地,对于Bool!/BOOL也如此)将不会进行反序列化。解决这些问题的简单方法是为这些属性提供初始值;而不是class ServerObject: NSObject {
var objectId: Int!
}这样做
class ServerObject: NSObject {
var objectId: Int = -1
}Eson可以通过CocoaPods获取。要安装它,只需将以下行添加到您的Podfile中
pod "Eson", :git => 'https://github.com/schrockblock/eson'Elliot Schrock
Eson可在MIT许可证下使用。有关更多信息,请参阅LICENSE文件。