JSONDecoder-Keypath 0.1.0

JSONDecoder-Keypath 0.1.0

测试测试
语言语言 SwiftSwift
许可 MIT
发布上次发布2017年10月
SwiftSwift 版本4.0
SPM支持 SPM

Alexandr Goncharov 维护。



  • Alexandr Goncharov

为 Swift.JSONDecoder 添加嵌套键路径支持

理由

在撰写本文时,我发现大多数流行的框架(大多为网络封装器)在处理键路径时做得非常糟糕。

因此,假设我们有一个 DecodableCodable)对象,但是在 API 响应中我们得到它在某些自定义路径下。大多数解决方案已经提供了通过键路径提取对象的方法,并添加了 Codable 支持。但是问题是我在几乎所有的例子中看到的实现都是这样的:

  1. 使用 JSONSerializationData 中提取 [String: Any]
  2. 在这个字典中遵循键路径
  3. 将给定对象转换为 Data
  4. 使用 JSONDecoder 解析对象

很明显,数据来回转换是一种额外的资源浪费。此外,在大量数据的情况下,这绝对不推荐。

此包消除了前三个步骤。

用法

假设你有一个 Item 模型

struct Item: Codable {
 ...
}

并有一个如下的 JSON

{
 "foo" : <actual object>
}

要解析这个,你需要写

let jsonData: Data = ...
let item = try decoder.decode(Item.self, from: jsonData, keyPath: "foo")

也支持嵌套键路径

let item = try decoder.decode(Item.self, from: jsonData, keyPath: "foo.bar")

键路径分隔符可以配置

let item = try decoder.decode(Item.self, from: jsonData, keyPath: "foo/bar", keyPathSeparator: "/")

内部实现

包向 JSONDecoder 添加了新方法

func decode<T>(_ type: T.Type,
                   from data: Data,
                   keyPath: String,
                   keyPathSeparator separator: String = ".") throws -> T where T : Decodable

在这个调用中,keypath 存储在 JSONDecoder.userInfo 中,然后使用私有类 KeyPathWrapper<T> 作为类型参数调用标准 decode 方法。在 KeyPathWrapper 构造函数中,从 userInfo 中获取键路径数据,并使用这些值遍历解码器。之后,解码原始类型。

安装

Swift 包管理器

将以下行 .Package(url: "https://github.com/0111b/JSONDecoder-Keypath.git") 添加到您的 Package.swift 文件中。

结论

这基本上是对自定义对象编码的简单实现,花费了我不到几个小时。但它表明我们必须考虑我们如何使用提供的 API,而不要偷懒去看里面的内容。

计划中

  • 扩展单元测试
  • 添加 CocoaPods Spec