我正在尝试从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}
我还能如何解决这个错误?