我发现this question on parsing JSON in Swift 3非常有帮助,但我注意到我的JSON结构有一个“天气”键的数组(见红色箭头)。我能够解析JSON输出的其他部分,但是这个数组导致了问题。
问题:为什么我无法使用处理此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()
}
}
答案 0 :(得分:3)
错误使问题相当清楚(并且查看问题开头的输出。" weather"键的值不是字典。它是一个数组字典。
所以这个:
let weatherMain = parsedData["weather"] as! [String:Any]
需要:
let weatherMain = parsedData["weather"] as! [[String:Any]]
作为旁注,在您的应用中使用!
是等待发生的崩溃。您应该安全地展开并安全地投射可能实际上并不符合您的想法的值。我强烈建议你花一些时间在The Swift Programming Language一书中查看关于选项,类型转换和可选链接的部分。