测试测试 | ✗ |
语言语言 | SwiftSwift |
许可 | MIT |
发布上次发布 | 2017年10月 |
SwiftSwift 版本 | 4.0 |
SPM支持 SPM | ✓ |
由 Alexandr Goncharov 维护。
为 Swift.JSONDecoder 添加嵌套键路径支持
在撰写本文时,我发现大多数流行的框架(大多为网络封装器)在处理键路径时做得非常糟糕。
因此,假设我们有一个 Decodable
(Codable
)对象,但是在 API 响应中我们得到它在某些自定义路径下。大多数解决方案已经提供了通过键路径提取对象的方法,并添加了 Codable
支持。但是问题是我在几乎所有的例子中看到的实现都是这样的:
JSONSerialization
从 Data
中提取 [String: Any]
Data
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
中获取键路径数据,并使用这些值遍历解码器。之后,解码原始类型。
将以下行 .Package(url: "https://github.com/0111b/JSONDecoder-Keypath.git")
添加到您的 Package.swift
文件中。
这基本上是对自定义对象编码的简单实现,花费了我不到几个小时。但它表明我们必须考虑我们如何使用提供的 API,而不要偷懒去看里面的内容。