Ошибка при декодировании JSON: «Ожидается декодирование массива <Any>, но вместо этого найден словарь». - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь получить некоторые данные из 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}

Как еще можно подойти к этому, чтобы избавиться от ошибки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...