Как исправить ошибку «несоответствие» в Xcode при попытке декодирования JSON

#json #swift #jsondecoder

#json #swift #jsondecoder

Вопрос:

Я новичок в языке Swift и пытаюсь создать простое приложение для синтаксического анализа JSON в Xcode.

Вот ошибка, которую я получаю: несоответствие типов (Swift.Двойной, Swift.Ошибка декодирования.Context(codingPath: [CodingKeys(stringValue: «Дата», intValue: nil)], debugDescription: «Ожидалось декодирование Double, но вместо этого найдена строка / данные.», лежащая в основе ошибка: nil))

Вот ссылка, которую я хочу проанализировать: https://www.cbr-xml-daily.ru/daily_json.js

Какая модель у меня для этого есть: (Я использовал https://app.quicktype.io за его создание)

 struct Welcome: Codable {
    var date, previousDate: Date
    var previousURL: String
    var timestamp: Date
    var valute: [String: Valute]

    enum CodingKeys: String, CodingKey {
        case date = "Date"
        case previousDate = "PreviousDate"
        case previousURL = "PreviousURL"
        case timestamp = "Timestamp"
        case valute = "Valute"
    }
}

struct Valute: Codable {
    var id, numCode, charCode: String
    var nominal: Int
    var name: String
    var value, previous: Double

    enum CodingKeys: String, CodingKey {
        case id = "ID"
        case numCode = "NumCode"
        case charCode = "CharCode"
        case nominal = "Nominal"
        case name = "Name"
        case value = "Value"
        case previous = "Previous"
    }
}
  

И вот код для синтаксического анализа и декодирования:

 func request(urlString: String, completion: @escaping (Welcome?, Error?) -> Void) {
    guard let url = URL(string: urlString) else { return }
    
    URLSession.shared.dataTask(with: url) { (data, response, error) in
        if let error = error {
            print("Some error")
            completion(nil, error)
            return
        } else {
            guard let data = data else { return }
            do {
                let welcome = try JSONDecoder().decode(Welcome.self, from: data)
                completion(welcome, nil)
            } catch let jsonError {
                print("Failed to decode JSON: (jsonError)")
                completion(nil, jsonError)
            }
            
        }
    } .resume()
}
  

Буду очень благодарен за любую помощь / совет.

Ответ №1:

Это потому, что вы не декодируете Date должным образом.

Попробуйте установить dateDecodingStrategy для вашего JSONDecoder :

 do {
    let decoder = JSONDecoder()
    decoder.dateDecodingStrategy = .iso8601
    let welcome = try decoder.decode(Welcome.self, from: data)
    completion(welcome, nil)
} catch let jsonError {
    print("Failed to decode JSON: (jsonError)")
    completion(nil, jsonError)
}