Ошибка при сериализации - PullRequest
0 голосов
/ 29 мая 2018

Я получаю эту ошибку, когда пытаюсь продолжить анализ JSON.Кто-нибудь знает, что я должен сделать, чтобы это исправить?

Ошибка 1 : не удается подписать значение типа 'AudiobookJSON' (он же 'Array<Dictionary<String, Any>>') с индексомтип 'String'

Ошибка при печати

Модель файла: Audiobook.swift:

import Foundation


struct Audiobook : Codable {
    let id: Int
    let descricao: String
    let urlImagem: String

    init(dictionary: AudiobookJSON) {
        self.id = dictionary["id"] as! Int//////ERROR MESSAGE ////////
        self.descricao = dictionary["descricao"] as! String/////ERROR MESSAGE
        self.urlImagem = dictionary["urlImagem"] as! String////ERROR MESSAGE
    }

}

Сетевая папка: APIClient.swift:

import Foundation

typealias AudiobookJSON = [[String: Any]]

struct APIClient {

    static func getAudiobooksAPI(completion: @escaping ([Audiobook]?) -> Void) {

        let url = URL(string: "https://alodjinha.herokuapp.com/categoria")

        let session = URLSession.shared

        guard let unwrappedURL = url else { print("Error unwrapping URL"); return }

        let dataTask = session.dataTask(with: unwrappedURL) { (data, response, error) in

            guard let unwrappedDAta = data else { print("Error unwrapping data"); return }

            do {

                //let json = try JSONSerialization.jsonObject(with: unwrappedDAta, options: .allowFragments) as! [String:Any]
                //let posts = json["data"] as? AudiobookJSON
                let posts = try JSONDecoder().decode([Audiobook].self, from: unwrappedDAta)

                print(posts)



                completion(posts)

            } catch {
                print("Could not get API data. \(error), \(error.localizedDescription)")
            }
        }
        dataTask.resume()
    }
}

1 Ответ

0 голосов
/ 29 мая 2018

Как я вижу, AudiobookJSON - это массив пар ключ-значение, поэтому вы получаете ошибку: поэтому вы должны использовать кодируемый код:

Во-первых: вы должны сделать структуру типа Codable структуройвот так (ваши имена кодируемых структурных переменных должны совпадать с теми, которые вы получаете в ответе):

struct Audiobook: Codable {
    let id: Int?
    let descricao: String?
    let urlImagem: String?

}

Второе: когда вы получите ответ, то выполните синтаксический анализ напрямую, используя кодал:

guard let unwrappedDAta = data else { print("Error unwrapping data"); return }

do {

    let posts = try JSONDecoder().decode([Audiobook].self, from: unwrappedDAta)

    print(posts)
    completion(posts)

} catch let message {
    print("JSON serialization error:" + "\(message)")
}

Вы можете напрямую использовать ответ как:

for audio in posts {
  print("audio.id")
  print("audio.descricao")
  print("audio.urlImagem")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...