解码JSON时发生错误“预期对Array <any>进行解码,但找到了字典。”

时间:2018-11-02 16:26:05

标签: ios json swift

我正在尝试从an API获取一些数据,并且在打印结果时,我一直遇到此错误:

typeMismatch(Swift.Array<Any>, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "response", intValue: nil)], debugDescription: "Expected to decode Array<Any> but found a dictionary instead.", underlyingError: nil))

这些是结构

struct Status: Decodable {
    let status: String
    let response: [Response]
}

struct Response: Decodable {
    let docs: [Doc]
}

struct Doc: Decodable {
    let webUrl: String
    let abstract: String

    enum CodingKeys: String, CodingKey {
        case webUrl = "web_url"
        case abstract
    }

    init(from decoder:Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        abstract = try container.decode(String.self, forKey: .abstract)
        webUrl = try container.decode(String.self, forKey: .webUrl)
    }

}

然后我在fetchData中调用viewDidLoad,然后用结果填充数组var storyData = [Doc]()

    fetchData(url: jsonUrl) { (result: FetchResult<Status>) in
        switch result {
        case .success(let object): self.storyData = object.response.flatMap{$0.docs}
        print("Results \n\n\n\n \(object.response.flatMap{$0.docs})")
        case .failure(let error): print(error)
        }
    }

我不确定要在此处进行哪些更改才能使其正常工作。我尝试使用quicktype.io来比较我的代码,并且我的结构几乎与生成它的方式完全相同。这是该站点上生成的,以供参考:https://app.quicktype.io?share=GGomMYH27NtkVpxXiAxB

我已经检出this question,从@vadian发布的解决方案中,我发现JSON成员response是一个字典,docs是一个数组字典-但是我很困惑,因为字典数组仍然是数组,对吗?同样基于他的解决方案,我正在解码初始结构Status,然后通过访问response并最终在docs中获得所需的内容:

self.storyData = object.response.flatMap{$0.docs}

我还能如何解决这个错误?

0 个答案:

没有答案