Swift中的JSON之战(Object Mapper vs Codable)
映射:
映射是一种操作,其中给定集合(域)的每个元素与第二个集合(范围)的一个或多个元素相关联。
在Swift中进行映射:
通常,当应用程序与外部API甚至有时与本地静态数据进行交互时,我们实际上会处理不同的数据类型,例如JSON或plist,或者有时甚至是其他一些格式。 我们需要使用JSON数据映射模型类对象,以便我们可以对业务流程进行建模。 在Swift中,我们具有以下用于解析和映射JSON与我们的模型对象的公共库:
– JSON序列化
– Swifty JSON
–可编码
– ObjectMapper
在本文中,我们将学习Swift中两个最常见的解析和映射库,并将分析两者之间的区别。
对象映射器:
ObjectMapper是一个框架,可以将JSON转换为对象(反之亦然)。 使用ObjectMapper之类的库,可以更轻松,快速地实现JSON的解析和映射。
为了使用ObjectMapper,我们需要实现Mappable协议:
公共协议BaseMappable {
变异功能映射(map:Map){
}
公共协议可映射:BaseMappable {
初始化?(地图:地图)
}
对于使用ObjectMapper:
1.我们的对象需要从Mappable扩展
2.我们的对象需要实现映射功能,在其中我们将指定JSON的哪些属性分配给该对象的哪些属性。
3.必须将属性声明为可选变量
可编码:
Codable是Swift4标准库中引入的协议。 它提供三种类型:
可编码协议:用于编码。
可解码协议:用于解码。
可编码协议:用于编码和解码。
typealias可编码=可编码和可解码
使用Codable:
1.要对自定义类型进行编码和解码,需要采用可编码协议。
2.自定义类型必须具有可编码类型属性。
3.可编码类型包括Int,Double,String,URL,Data等数据类型。
4.如果其他属性(例如数组,字典)由可编码类型组成,则可进行编码。
ObjectMapper和Codable之间的区别
对象映射器
- 这是第三方框架。
- 对象映射器具有类型转换支持。
- 据说Object Mapper比Codable快。 (或者比JSONEncoder / Decoder更精确)
- 不保证将ObjectMapper与新的Swift版本一起使用进行更新。
- 在您的项目中添加额外的依赖关系。
- ObjectMapper是进一步继承自BaseMappable协议的协议。
- 需要从不使用CocoaPods或其他依赖项管理器更新版本。
- 需要使用针对JSON的键为每个字段定义映射。
可编码
- 这是Swift本机解决方案。
- Codable可能比ObjectMapper慢,因为它是内置的映射解决方案。 当您没有编码键时,swift将使用mirror读取类属性,然后进行映射。
- 在Codable中,我们需要外部库来进行类型转换。
- 删除用于解析和映射的第三方依赖项。
- 如果模型对象字段与JSON键不同,则需要使用CodingKey协议将键定义为枚举。
- 可编码是一种协议,它由另外两个协议组成:可编码和可解码。
- 如果字段与JSON中的键具有相同的名称,则Auto会自动生成encoding和init方法,因此所需的代码更少。
- 由于它是本机解决方案,因此Foundation框架中提供了新的更新。
例:
假设我们的应用程序中有一个Customer对象,一个Address对象,一个Company对象等。换句话说,像这样:
我们从Remote API接收JSON,并为我们的业务逻辑流程填充这些模型对象。 让我们使用ObjectMapper和Codable分析解析和映射这些模型对象。
使用ObjectMapper:
使用Coadable:
如您所见 ,在Address类中,我们定义了自定义键,因为我们的邮政编码字段不同于zipCodeForAddress。
结论:
在我看来,Codable是在Swift中映射模型对象的更优化和更好的方法,它是Swift的本机解决方案,并且消除了第三方依赖性。 由于ObjectMapper具有更好的可读性,知名度以及对Alamofire的支持,因此仍然更加受欢迎。 在不久的将来,我们希望在iOS开发人员社区中更多地使用Codable在Swift中进行解析和映射。