与 Objective-C 相比,解析 Swift 中嵌套的 JSON

Parsing nested JSON in Swift compared with Objective-C

我正在尝试解析之前在 Objective-C 中解析的 Swift 中的一些 JSON,但遇到了一些困难。

在 objective-C 中,我能够使用以下方法简单地解析它:

NSError* error;
NSDictionary *jsonResults = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSNumber *temp = jsonResults[@"main"][@"temp"];
NSNumber *humidity = jsonResults[@"main"][@"humidity"];

在 Swift 中,到目前为止,我的代码在尝试序列化为字典时出错,或者,如果我在尝试访问 JSON 中的值时序列化为字符串.

在 Swift 中执行此操作的正确方法是什么。这是我尝试序列化到字典中的版本,它给出了一个错误

  //assemble url query items
    components.queryItems = queryItems
    let url = components.url
    let task = URLSession.shared.dataTask(with: url!) { //open 2
    [weak self] data, response, error in
    print("heard back from task")
    guard let data = data, error == nil else { return }
    do {
    let jsonResults = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [Dictionary:Any]
    //Gives error Dictionary' requires that 'Value' conform to 'Hashable'
    let main = jsonResults["main"] as Any
    let temp = main[3]
    completion("got here")
    } catch let error as NSError {
    print(error)
    }

这是 JSON 的示例:

{"coord":{"lon":10.73,"lat":59.91},"weather":[{"id":804,"main":"Clouds","description":"overcast clouds","icon":"04d"}],"base":"stations","main":{"temp":49.62,"feels_like":43.45,"temp_min":48,"temp_max":52,"pressure":987,"humidity":30},"wind":{"speed":1.99,"deg":95,"gust":7},"clouds":{"all":95},"dt":1589387530,"sys":{"type":3,"id":2009047,"country":"NO","sunrise":1589337830,"sunset":1589398989},"timezone":7200,"id":3143242,"name":"Oslo County","cod":200}

在swift中你只需要下面的代码:-

型号:

struct Model: Codable {
    let coord: Coord
    let weather: [Weather]
    let base: String
    let main: Main
    let wind: Wind
    let clouds: Clouds
    let dt: Int
    let sys: Sys
    let timezone, id: Int
    let name: String
    let cod: Int
}

struct Clouds: Codable {
    let all: Int
}

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

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

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

struct Sys: Codable {
    let type, id: Int
    let country: String
    let sunrise, sunset: Int
}

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

struct Wind: Codable {
    let speed: Double
    let deg, gust: Int
}

正在解析:

do {
    let model = try JSONDecoder().decode(Model.self, from: data)
} catch {
    print(error.localizedDescription)
}