测试测试通过 | ✓ |
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文件。