簡體   English   中英

使用 Codable 解析 JSON 給我 nil - Swift

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM