假设我有以下从后端返回的数据 struct :
struct DummyItem: Decodable {
let number: Int
let name: String
}
struct DummyResponse {
let items: [DummyItem]
let meta: String
}
我还有这个助手 struct 来跳过解码失败的对象:
struct OptionalObject<Base: Decodable>: Decodable {
let value: Base?
init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
do {
self.value = try container.decode(Base.self)
} catch {
self.value = nil
}
}
}
我是这样使用它的:
extension DummyResponse: Decodable {
enum CodingKeys: String, CodingKey {
case items, meta
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let nullableItems = try container.decode([OptionalObject<DummyItem>].self, forKey: .items)
self.items = nullableItems.compactMap({ $0.value })
self.meta = try container.decode(String.self, forKey: .meta)
}
}
例如,当我在后端响应中收到一些损坏的DummyItem
时,我仍将获得DummyResponse
,但该项目将被跳过
{
"items": [
{
"number": 1,
"name": "first"
},
{
"number": 2,
"name": "second"
},
{
"number": 3,
"name": null
},
],
"meta": "Metadata"
}
发生这种情况时,我如何访问有问题对象的原始JSON数据?
我假设这可以在OptionalObject
struct 的catch
块中完成.这似乎是一项简单的任务(解码器必须以某种方式访问它试图解码的原始数据,对吗?)