CoreCereal 2.0.1

CoreCereal 2.0.1

测试已测试
Lang语言 SwiftSwift
许可证 Apache 2
发布上次发布2017年1月
SwiftSwift 版本3.0
SPM支持 SPM

Josh Gretz 维护。



Cereal

一个用 Swift 编写的轻量级序列化框架。支持 JSON 到对象的转换。

主要由 Josh GretzTruefit 编写。您可以通过查看 iOS Conf 来了解示例项目。

开始使用

概述

Cereal 使用标准的 NSJsonSerialization 类来解析 json。Cereal 带来的优势是能够与您的对象一起工作,而不是集合。

因此

  • 在序列化方面,您可以直接序列化对象,而不是手动将它们转换为字典和数组。
  • 在反序列化方面,您得到的是对象而非字典和数组

该框架的目的是消除手动操作字符串名和数据解析的重复代码。

安装

作为 Cocoa Pod

作为子模块

  • 您可以将此仓包克隆下来并将其添加为子模块到现有的 Git 项目中。我一般喜欢将所有子模块放在一个子模块文件夹里。
$ git submodule add https://github.com/jgretz/Cereal.git
  • 打开您的工作区,将 Cereal.xcodeproj 拖动到项目树中
  • 将 Cereal 添加为链接框架
    • 在项目树中选择您的项目
    • 选择“常规”选项卡
    • 滚动到底部的“链接框架和库”部分
    • 单击加号图标
    • 从列表中选择 Cereal.framework

NSObject 需求

Swift 在反射(坦白说,它甚至还没开始)方面还未跟上 Objective-C。因此,为了施行“魔法”,我们需要依赖 NSObject 提供的反射方法。因此,任何希望使用 Cereal 进行序列化或反序列化的对象都必须继承自 NSObject。

序列化对象

var foo = Foo()
foo.bar = "Hello World"

let serializer:JsonCerealizer = JsonCerealizer.object()
let json = serializer.toString(foo)

反序列化对象

var json = "{\"bar\":\"Hello World\"}"

let serializer:JsonCerealizer = JsonCerealizer.object()
let foo = serializer.create(Foo.self, json) as! Foo

默认情况下,Cereal 会检查属性的类型,如果该属性是 NSObject 类型,它将会递归地对其进行反序列化。这个逻辑的唯一例外就是数组(如下文复杂情况部分所述)。Cereal 还使用 CoreMeta 创建对象,因此如果容器已配置,您的对象也将经过 IOC / DI。

转换

通常,某个 API 对其字段的命名并不符合您的命名规范(例如,C# API 使用 Pascal 案,但 Swift 喜欢使用 Camel 案)。转换功能允许您提供这种映射的逻辑。它可以是简单的更改大小写,也可以是基于逻辑的映射。

以下提供了两种内置转换

  • PascalCase
  • CaseInsensitive

默认情况下,Cerealizer 将使用 CaseInsensitive 转换。

日期格式化程序

日期格式化是开发人员的噩梦之一。C#、Java、Rails、Node 等,各不相同。为了帮助您序列化和反序列化日期,Cerealizer 提供了一个 NSDateFormatter 属性,您可以设置正确的格式以适应您的具体情况。

默认情况下,Cerealizer 将使用格式 "yyy-MM-dd HH:mm:ss"。

该框架还提供了两种其他常见日期格式化程序

  • Iso8601UtcDateFormatter
  • MicrosoftJsonDateFormatter

更复杂的序列化情况

Cereal 为您提供了两个协议,您的类可以实施以处理更加复杂的情况。实施这些协议将赋予您对过程的细粒度控制。

Cerealizable

当您想控制一个对象的序列化时,请实现此协议。它需要三个方法

func shouldSerializeProperty(propertyName: String) -> Bool

func overrideSerializeProperty(propertyName: String) -> Bool

func serializeProperty(propertyName: String) -> AnyObject?

Decerealizable

当您想控制一个对象的反序列化时,请实现此协议。它需要四个方法

func typeFor(propertyName: String, value: AnyObject?) -> AnyClass?

func shouldDeserializeProperty(propertyName: String) -> Bool

func overrideDeserializeProperty(propertyName: String, value: AnyObject?) -> Bool

func deserializeProperty(propertyName: String, value: AnyObject?)

此方法可能是需要解释的方法之一。该方法的目的在于处理数组的情况。由于内省(introspection)的工作方式,我们无法获取数组中对象的类型。该方法的目的在于供您为每个实例返回类型。

其他想法

分支

我最初用 Objective-C 写了这个框架。这个版本仍然可以在 v1-objc 分支中找到。多年来使用过程中,我的团队在一些情况下需要支持 XML,所以我们添加了 XmlCerealizer。由于我们一段时间内没有需求,我选择不在当前时刻移植它。

如果您需要这个功能,请随时联系或甚至提交一个 PR :)

依赖项

许可证

版权所有 2011 TrueFit Solutions

根据 Apache 许可证第 2 版(“许可证”);您不得使用此文件,除非遵守许可证条款。您可以在以下位置获取许可证的副本:

https://apache.ac.cn/licenses/LICENSE-2.0

除非适用法律或书面同意,否则根据本许可证分发软件是以“现状”为基础分发的,不提供任何形式的明示或默示保证或条件。请参阅许可证以了解规定许可和限制的特定语言。