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中进行解析和映射。