swift не может копаться в данных JSONDecoder, полученных через alamofire - PullRequest
0 голосов
/ 18 мая 2019

Невозможно прочитать данные из раздела «погода» файла JSONDecoder, полученные через Almofire

данные, напечатанные в консоли:

{ "коорд": { "долгота": - 0,13, "ш": 51,51}, "погода": [{ "ID": 521, "главный": "Дождь", "Описание": "душа дождь», "значок": "09D"}], "база": "станция", "главная": { "Темп": 289,64, "Давление": 1006, "влажность": 48, "temp_min": 286,48, "temp_max": 292,59}, "видимость": 10000, "ветер": { "скорость": 1}, "облака": { "все": 85}, "дт": 1558190870, "SYS": { "тип ": 1," идентификатор ": 1414," сообщение ": 0,009," страна ":" GB», "восход": 1558152298, "закат": 1558208948}, "идентификатор": 2643743, "имя": "Лондон" , "треск": 200}

struct MyWeatherData: Codable {
    let coord : coord
    let weather : weather
}

struct coord: Codable {
    let lon: Double
    let lat: Double

}

struct weather: Codable {
    let array : [unknown] //here is my problem
    let base : String
}

struct unknown : Codable {
    let id : Int
    let main: String
    let description : String
    let icon : String
}


let cityLink = "https://api.openweathermap.org/data/2.5/weather?q=London"



        Alamofire.request(self.cityLink+"&APPID=\(self.myId)").responseJSON { (response) in
//            print("Request: \(String(describing: response.request))")   // original url request
//            print("Response: \(String(describing: response.response))")
//            print("Result: \(response.result)")

            if let data = response.data, let utf8 = String(data: data, encoding: .utf8) {

                print("Data is: \(utf8)")
                do {
                    let myData = try JSONDecoder().decode(MyWeatherData.self, from: data)
//                    print("lat is: \(myData.coord.lat)") //ok, working
                    print("weather is: \(myData.weather.main)") //not working

                } catch let myError {
                    print("error is: ", myError)
                }
            }


        }

Ответы [ 3 ]

1 голос
/ 18 мая 2019

Пожалуйста, назовите ваш класс / Модели с первой буквы.

Проблема в том, что на MyWeatherData погода - это массив, поэтому он становится:

struct MyWeatherData: Codable {
    let coord : Coord
    let weather : [Weather]
}

struct Coord: Codable {
    let lon: Double
    let lat: Double
}

struct Weather: Codable {
    let id : Int
    let main: String
    let description : String
    let icon : String
}
1 голос
/ 18 мая 2019

В MyWeatherData свойство weather должно иметь тип [weather], поскольку JSON возвращает массив в ключе weather:

{
  "coord": {
    "lon": -0.13,
    "lat": 51.51
  },
  "weather": [{
    "id": 521,
    "main": "Rain",
    "description": "shower rain",
    "icon": "09d"
  }],
  "base": "stations",
  "main": {
    "temp": 289.64,
    "pressure": 1006,
    "humidity": 48,
    "temp_min": 286.48,
    "temp_max": 292.59
  },
  "visibility": 10000,
  "wind": {
    "speed": 1
  },
  "clouds": {
    "all": 85
  },
  "dt": 1558190870,
  "sys": {
    "type": 1,
    "id": 1414,
    "message": 0.009,
    "country": "GB",
    "sunrise": 1558152298,
    "sunset": 1558208948
  },
  "id": 2643743,
  "name": "London",
  "cod": 200
}

Таким образом, ваши типы должны выглядеть следующим образом:

struct MyWeatherData: Codable {
    let coord: coord
    let weather: [weather]
    let base: String
}

struct coord: Codable {
    let lon: Double
    let lat: Double
}

struct weather : Codable {
    let id : Int
    let main: String
    let description : String
    let icon : String
}

И тогда вы можете получить weather экземпляр по myWeatherData.weather.first

0 голосов
/ 18 мая 2019

Нет, проблема не в , вот моя проблема , проблема в MyWeatherData.

Пожалуйста прочитайте JSON. Это очень просто. Значение ключа weather заключено в [], поэтому объект является массивом.

И назовите все структуры заглавными буквами, чтобы избежать путаницы, например let weather : weather

struct MyWeatherData : Decodable {
    let coord : Coord
    let weather : [Weather]
}

struct Coord : Decodable {
    let lon: Double
    let lat: Double
}

struct Weather : Decodable {
    let id : Int
    let main: String
    let description : String
    let icon : String
}
...