Быстрое декодирование JSON из URL

#swift

#swift

Вопрос:

Моя проблема довольно проста, но я не могу найти решение. Я знаю, что есть много руководств о том, как я мог бы сделать это другим способом, но я хочу, чтобы это было просто.

Я знаю, как получить данные, если JSON html выглядит следующим образом:

 {"amount":"224.60","currency":"USD"}
  

Но я не знаю, как получить данные, если они выглядят так:

 "main":{"temp":280.3,"pressure":1023,"humidity":75,"temp_min":280.15,"temp_max":280.37}
  

Как определить, что мне нужно получить из «main»?

Мой код выглядит следующим образом:

 struct main: Decodable {
let humidity: String
  

}

 let url = "http://api.openweathermap.org/data/2.5/weather?q=Vilnius,LTUamp;appid=8a3e3ef324cffc653933f3216efcf80f"
    let urlObj = URL(string: url)

    URLSession.shared.dataTask(with: urlObj!) {(data, response, error) in
        do {
            var airs = try JSONDecoder().decode(main.self, from: data!)


            print(airs.humidity)

        } catch {
            print("error")
        }

    }.resume()
  

Это отлично работает с моим первым примером, когда я пытаюсь получить сумму. Но это не работает со вторым примером.

Ответ №1:

Вы можете попробовать

 struct Root: Codable {
    let main: Main
}

struct Main: Codable {
    let temp: Double
    let pressure, humidity: Int
    let tempMin, tempMax: Double

    enum CodingKeys: String, CodingKey {
        case temp, pressure, humidity
        case tempMin = "temp_min"
        case tempMax = "temp_max"
    }
}
  

 var airs = try JSONDecoder().decode(Root.self, from: data!)
  

или

   do {

    let con = try JSONSerialization.jsonObject(with:data, options: [:]) as! [String:Any]
    let dataCC = con["main"] as! [String:Any] 
    let finData = try JSONSerialization.data(withJSONObject:dataCC, options: [:])
    let userCon = try JSONDecoder().decode(Main.self, from:finData) 
    print(userCon)

}
catch {

    print(error)
}