Я пытаюсь получить некоторые данные из 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
Я проверил этот вопрос и из решения, опубликованного @vadian, я понял, что в моем случае член JSON response
- это словарь, а docs
- массив словарей - однако я запутался, потому что массив словарей все еще массив, верно? Также основываясь на его решении, я декодирую исходную структуру Status
, а затем через нее обращаюсь к response
и, наконец, получаю то, что мне нужно в docs
:
self.storyData = object.response.flatMap{$0.docs}
Как еще можно подойти к этому, чтобы избавиться от ошибки?