Я пытаюсь загрузить массив JSON
словарей в объект с помощью swift, используя Alamofire
и SwiftyJSON
, но когда данные загружаются, я получаю сообщение об ошибке:
keyNotFound(CodingKeys(stringValue: "inProrgresss", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"inProrgresss\", intValue: nil) (\"inProrgresss\").", underlyingError: nil)).
В локализованном описании просто сказано, что данные отсутствуют. Мой JSON - здесь, и мой код выглядит так:
struct CompData: Codable {
let inProrgresss: [[String: String]]
let past: [[String: String]]
let upcoming: [[String: String]]
}
func getData(url: URLConvertible) {
SVProgressHUD.show()
Alamofire.request(url).responseJSON { (dataResponse) in
if dataResponse.result.value != nil {
SVProgressHUD.dismiss()
let JSONVar = JSON(dataResponse.result.value)
let data = Data(dataResponse.data!)
print(data)
let decoder = JSONDecoder()
do {
let newData = try decoder.decode(CompData.self, from: data)
print("NEWDATA \(newData)")
} catch {
print(error)
}
print(JSONVar)
}
}
}
Я новичок в преобразовании JSON в типы данных, и я не смог найти здесь ничего, что могло бы помочь.
Пожалуйста, читать JSON. Ключа нет inProrgresss
.
И создайте структуру для словарей, это довольно просто
struct CompData: Decodable {
let inProgress: [Location]?
let past: [Location]
let upcoming: [Location]
}
struct Location : Decodable {
let city, countryCode, name, date, country, id : String
}
И объявите inProgress
необязательным, потому что массив пуст.
Редактировать:
В getData
много лишнего кода. Это более эффективно. convertFromSnakeCase
делает то, что говорит.
func getData(url: URLConvertible) {
SVProgressHUD.show()
Alamofire.request(url).responseData { (response) in
SVProgressHUD.dismiss()
switch response.result {
case .success(let data):
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
do {
let result = try decoder.decode(CompData.self, from: data)
print("NEWDATA \(result)")
} catch {
print(error)
}
case .failure(let error): print(error)
}
}
}
Да, будет, но удобнее создавать структуры и для других словарей
Итак, просто повторите структуру, и она сделает это автоматически, или мне нужно изменить код getData?
О, да... но будет ли это теперь конвертировать его в массив словарей, или мне нужно что-то еще сделать?