Синтаксический анализ с помощью Alamofire 5 - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь проанализировать этот ответ API, но получаю эту ошибку

"Не удалось преобразовать значение типа '__NSDictionaryI' (0x1e06425d8) в 'NSData' (0x1e06418e0)"

. Вот мой код, ответ API и класс модели.

class func getCityApi(viewController: UIViewController,
                      completion:@escaping (_ result:[CityDetails])->(),
                      errorHandler:@escaping (_ result:Error,_ statusCode:Int?)->()
) {

    AF.request(KCity, method: .get, parameters: nil, headers: nil).responseJSON { response in
        switch response.result{
        case.success(let data):
            do{
                let jsonData = try JSONDecoder().decode(City.self, from: data as! Data)
                print(jsonData)
                completion(jsonData.data)
            }
            catch{

            }

        case .failure(let error):
            print(error.localizedDescription)
        }
    }
}

Структура ответа API

enter image description here

Класс модели

struct City: Codable {
  var data: [CityDetails]
  var status: Bool
  var message: String
}

struct CityDetails: Codable{
  var id: Int
  var location: String
}

Ответы [ 3 ]

2 голосов
/ 21 февраля 2020

Вам нужен ответ Data. Заменить

AF.request(KCity, method: .get, parameters: nil, headers: nil).responseJSON { response in

на

AF.request(KCity, method: .get, parameters: nil, headers: nil).responseData { response in

и

let jsonData = try JSONDecoder().decode(City.self, from: data as! Data)

на

let jsonData = try JSONDecoder().decode(City.self, from: data)
1 голос
/ 22 февраля 2020

Если у вас уже есть тип Decodable, вы можете просто использовать responseDecodable напрямую, не нужно разбирать ответ самостоятельно:

AF.request(KCity).responseDecodable(of: City.self) { response in
    // response is DataResponse<City, AFError>
}

Чтобы узнать больше, прочитав Alamofire Документация по использованию .

1 голос
/ 21 февраля 2020
let jsonData = try JSONDecoder().decode(City.self, from: data as! Data)

изменить на

let jsonData = try JSONDecoder().decode(City.self, from: data as! Dictionary<String,Any>)
...