我有以下数据结构:
{
"type": "foo"
"data": { /* foo object */ }
}
这是我解码它的课程:
final public class UntypedObject: Decodable {
public var data: Data
enum UntypedObjectKeys: CodingKey {
case data
}
required public init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: UntypedObjectKeys.self)
self.data = try values.decode(Data.self, forKey: .data)
}
}
我正在获取这些对象的数组,这就是我解码它的方式:
let decoder = JSONDecoder()
let objectList = try decoder.decode([UntypedObject].self, from: data)
但是我在控制台中收到此错误:
typeMismatch(Swift.Array,Swift.DecodingError.Context(codingPath:[Foundation。(_ JSONKey in _12768CA107A31EF2DCE034FD75B541C9)(stringValue:" Index 0",intValue:Optional(0)),Playground_Sources.UntypedObject。 UntypedObjectKeys.data],debugDescription:"预计会解码数组,但会找到一个字典。",underlyingError:nil))
所以问题是,是否有可能将正确的JSON对象解码为Data
类型的属性,如果是的话 - 我该如何实现?
答案 0 :(得分:2)
这对于OP来说可能为时已晚,但是我遇到了类似的问题,需要解决方案。 希望这对其他人有用。
对于我的问题,我想使用Decodable
来解码JSON
使用Swift 5.1。但是,在对象层次结构的各个点上,我想返回一个不支持Decodable
但支持从(非平凡的)JSON字符串解码的objC对象(来自第三方库)。我通过使用JSONSerialization
创建了无类型的对象层次结构来解决了这个问题,我可以从解码器的userInfo
属性中检索并使用解码器的contextPath
搜索以找到我的数据,然后使用{{1 }} 至
将其转换回字符串数据。
此解决方案不假设要获取具有“数据”键的对象所需的对象/数组层次结构。
JSONSerialization
答案 1 :(得分:0)
解码时,可以先检查它是否为数组?
然后,如果“ true”,则上面的代码有效,否则对字典进行解码
查看这篇有关解码的文章,我发现它很有帮助:
https://medium.com/swiftly-swift/swift-4-decodable-beyond-the-basics-990cc48b7375
答案 2 :(得分:0)
针对您的错误,尤其是更改
let objectList = try decoder.decode([UntypedObject].self, from: data)
到
let objectList = try decoder.decode(UntypedObject.self, from: data)
将对其进行修复(但我仍然认为您无法将JSON上“ data”键的内容作为Data获取。)
发生错误的原因是,您的JSON响应包含一个对象作为根,该对象在Swift中被视为字典(由于键/值映射),但是您尝试解码一个对象数组。