Отсутствуют данные JSONDecoder

Я пытаюсь загрузить массив 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 в типы данных, и я не смог найти здесь ничего, что могло бы помочь.

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
0
163
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пожалуйста, читать 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)
        }
    }
}

О, да... но будет ли это теперь конвертировать его в массив словарей, или мне нужно что-то еще сделать?

Luke B 28.05.2019 21:18

Да, будет, но удобнее создавать структуры и для других словарей

vadian 28.05.2019 21:19

Итак, просто повторите структуру, и она сделает это автоматически, или мне нужно изменить код getData?

Luke B 28.05.2019 21:20

Другие вопросы по теме