[英]Parsing JSON using Codable giving me nil - Swift
我正在嘗試解析 JSON 數據。 這是 model:
struct WeeklyForecastResponse: Codable {
var cod: String
var message, cnt: Int
var list: [List]
var city: City
// MARK: - City
struct City: Codable {
var id: Int
var name: String
var coord: Coord
var country: String
var population, timezone, sunrise, sunset: Int
}
// MARK: - Coord
struct Coord: Codable {
var lat, lon: Double
}
// MARK: - List
struct List: Codable {
var dt: Int
var main: MainClass
var weather: [Weather]
var clouds: Clouds
var wind: Wind
var sys: Sys
var dtTxt: String
var snow, rain: Rain?
enum CodingKeys: String, CodingKey {
case dt, main, weather, clouds, wind, sys
case dtTxt = "dt_txt"
case snow, rain
}
}
// MARK: - Clouds
struct Clouds: Codable {
var all: Int
}
// MARK: - MainClass
struct MainClass: Codable {
var temp, tempMin, tempMax: Double
var pressure, seaLevel, grndLevel, humidity: Int
var tempKf: Double
enum CodingKeys: String, CodingKey {
case temp
case tempMin = "temp_min"
case tempMax = "temp_max"
case pressure
case seaLevel = "sea_level"
case grndLevel = "grnd_level"
case humidity
case tempKf = "temp_kf"
}
}
// MARK: - Rain
struct Rain: Codable {
var the3H: Double
enum CodingKeys: String, CodingKey {
case the3H = "3h"
}
}
// MARK: - Sys
struct Sys: Codable {
var pod: Pod
}
enum Pod: String, Codable {
case d = "d"
case n = "n"
}
// MARK: - Weather
struct Weather: Codable {
var id: Int
var main: MainEnum
var weatherDescription, icon: String
enum CodingKeys: String, CodingKey {
case id, main
case weatherDescription = "description"
case icon
}
}
enum MainEnum: String, Codable {
case clear = "Clear"
case clouds = "Clouds"
case rain = "Rain"
case snow = "Snow"
}
// MARK: - Wind
struct Wind: Codable {
var speed: Double
var deg: Int
}
}
URL 是api.openweathermap.org/data/2.5/forecast?lat=42.33&lon=-84.04&APPID=0729d39986bfdd23470f485457a04c6d&units=Imperial
這是實際的解析
guard let url = URL(string: fullURL) else {
print("Error getting the URL")
return
}
URLSession.shared.dataTask(with: url) {
(data, resp, err) in
DispatchQueue.main.async {
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let json = try decoder.decode(WeeklyForecastResponse.self, from: data!)
self.fiveDayWeatherData = [json]
self.temp = json.list[0].main.temp
}
catch {
print(error)
}
}
}.resume()
}
我收到此錯誤:致命錯誤:在展開可選值時意外發現 nil:文件。 有誰知道為什么? 我很確定我的 model 是正確的,並且 URL 工作正常。 我在解碼線上得到錯誤。
您正在強制解包data
,因此您可能沒有真正的響應。 您應該首先處理和檢查錯誤,然后解包數據。 您確定您對應用程序傳輸安全性有任意負載嗎? 因為您提供的 URL 肯定會返回數據。
URLSession.shared.dataTask(with: url) { [weak self] (data, resp, err) in
if let error = err {
return print(error.localizedDescription)
}
guard let data = data else {
return print("No data")
}
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
switch Result(catching: { try decoder.decode(WeeklyForecastResponse.self, from: data) }) {
case .success(let json):
DispatchQueue.main.async { [weak self] in
self?.fiveDayWeatherData = [json]
self?.temp = json.list[0].main.temp
}
case .failure(let error):
print(error.localizedDescription)
}
}.resume()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.