Eson 0.4.2

Eson 0.4.2

测试测试通过
Lang语言 SwiftSwift
许可 MIT
发布最后发布2017年9月
SwiftSwift 版本3.0
SPM支持 SPM

Elliot SchrockElliot Schrock 维护。



Eson 0.4.2

Eson

Eson 是在 Swift 中获取 JSON 序列化和反序列化的最简单方法之一。

Eson 的特色是什么?

  • 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 实现了两个函数,nameOfClassvalueForObject

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 键与属性名称

要在对象的 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文件。