在Swift 3中使用嵌套数组解析JSON

时间:2016-11-28 21:58:16

标签: arrays json swift

我发现this question on parsing JSON in Swift 3非常有帮助,但我注意到我的JSON结构有一个“天气”键的数组(见红色箭头)。我能够解析JSON输出的其他部分,但是这个数组导致了问题。 Snapshot of Console

问题:为什么我无法使用处理此JSON数据其他部分的[String:Any]模式?

这是我在控制台中的错误:无法将'__NSSingleObjectArrayI'(0x112e04be0)类型的值转换为'NSDictionary'(0x112e05108)。

import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let url = URL(string: "http://api.openweathermap.org/data/2.5/weather?q=London,uk&appid=MYAPIKEY")!

        let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
            if error != nil {
                print(error)
            }else {
                if let urlContent = data {
                    do {
                        let parsedData = try JSONSerialization.jsonObject(with: urlContent, options: .allowFragments) as! [String:Any]
                        print(parsedData)
                       let currentCondions = parsedData["main"] as! [String:Any]

                        for (key, value) in currentCondions {
                            print("\(key) - \(value)")
                        }

                        let locationInfo = parsedData["sys"] as! [String:Any]
                        for (key, value) in locationInfo {
                            print("\(key) - \(value)")
                        }

                        let weatherMain = parsedData["weather"] as! [String:Any]
                        print(weatherMain)

                    } catch {
                       print("JSON processessing failed")
                    }//catch closing bracket
                }// if let closing bracket
            }//else closing bracket
        }// task closing bracket
        task.resume()
    }
}

1 个答案:

答案 0 :(得分:3)

错误使问题相当清楚(并且查看问题开头的输出。" weather"键的值不是字典。它是一个数组字典。

所以这个:

let weatherMain = parsedData["weather"] as! [String:Any]

需要:

let weatherMain = parsedData["weather"] as! [[String:Any]]

作为旁注,在您的应用中使用!是等待发生的崩溃。您应该安全地展开并安全地投射可能实际上并不符合您的想法的值。我强烈建议你花一些时间在The Swift Programming Language一书中查看关于选项,类型转换和可选链接的部分。