Ошибка в декодировании: данные не могут быть прочитаны.Alamofire - PullRequest
0 голосов
/ 25 июня 2018

Я пытался проанализировать JSON через JSONDecoder и использовать Alamofire для извлечения данных.Однако, когда я запускаю приложение, оно показывает, что данные не могут быть прочитаны из-за неправильного формата.Я перепробовал много вещей, но все еще не работал.Любая помощь будет оценена.Источники ниже:

VC:

class SecondTaskVC: UIViewController {

var weatherModel = [WeatherModelDecodable]()

override func viewDidLoad() {
    let url = URL(string: "https://api.openweathermap.org/data/2.5/forecast?lat=42.874722&lon=74.612222&APPID=079587841f01c6b277a82c1c7788a6c3")

    Alamofire.request(url!).responseJSON { (response) in

        let result = response.data

        do{
            let decoder = JSONDecoder()
            self.weatherModel = try decoder.decode([WeatherModelDecodable].self, from: result!) // it shows this line as a problem

            for weather in self.weatherModel {
                print(weather.city.name)
            }
        }catch let error{
            print("error in decoding",error.localizedDescription)

        }

    }
     }
   }

Модель данных:

struct WeatherModelDecodable: Decodable {
  let city: CityDecodable
}

struct CityDecodable: Decodable {
  let name: String
 }

1 Ответ

0 голосов
/ 25 июня 2018

На самом деле структура ответа отличается от того, что вы пытаетесь сделать в этой строке,

self.weatherModel = try decoder.decode([WeatherModelDecodable].self, from: result!)

Ответ не является массивом, как вы можете видеть его в json viewer нажав этот URL в любом браузере.Вы ожидаете массив объектов json, но это не так.Поэтому, если вы декодируете его как отдельный объект, он будет правильно декодироваться, как показано ниже:

let weatherModel = try decoder.decode(WeatherModelDecodable.self, from: result!)
print(weatherModel.city.name)

Итак, SecondTaskVC будет выглядеть следующим образом:

class SecondTaskVC: UIViewController {

    var weatherModel: WeatherModelDecodable?

    override func viewDidLoad() {
        let url = URL(string: "https://api.openweathermap.org/data/2.5/forecast?lat=42.874722&lon=74.612222&APPID=079587841f01c6b277a82c1c7788a6c3")

        Alamofire.request(url!).responseJSON { (response) in

            let result = response.data

            do{
                let decoder = JSONDecoder()
                self.weatherModel = try decoder.decode(WeatherModelDecodable.self, from: result!)
                print(self.weatherModel!.city.name)
            }catch let error{
                print("error in decoding",error.localizedDescription)

            }

          }
        }
 }

Вы должны декодировать соответствующиеобъекты с той же структурой, которую вы получаете в ответе.

enter image description here

...