Swift 4 Decodable - 将JSON对象解码为`Data`

时间:2017-10-29 10:24:53

标签: swift4 decodable

我有以下数据结构:

{
    "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类型的属性,如果是的话 - 我该如何实现?

3 个答案:

答案 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中被视为字典(由于键/值映射),但是您尝试解码一个对象数组。