我正在尝试学习 Swift,并且正在努力理解有关处理 JSON 的部分,并通过使用以下代码得到“ fatal error :在解包可选值时意外发现 nil”:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var webView: UIWebView!
override func viewDidLoad() {
super.viewDidLoad()
let urlPath = "http://api.worldweatheronline.com/free/v2/marine.ashx?key=45e8e583134b4371a2fa57a9e5776&format=xml&q=45,-2"
let url: NSURL = NSURL(string: urlPath)!
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(url, completionHandler: {data, response, error -> Void in
println("Task completed")
if ((error) != nil) {
println(error)
} else {
var err: NSError?
println("URL: \(url)")
var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
println(jsonResult)
}
})
task.resume()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
我使用的 API key 是免费的,所以不用担心使用它。 JSON 结果应该看起来 something like this但我收到的却是:
Task completed
URL: http://api.worldweatheronline.com/free/v2/marine.ashx?key=45e8e583134b4371a2fa57a9e5776&format=xml&q=45,-2
fatal error: unexpectedly found nil while unwrapping an Optional value
我假设 jsonResult 变量是导致问题的原因,但即使我尝试使用类似
的内容强制解开它(我认为这就是我正在做的事情?)var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary
它仍然失败,并显示“‘as’后的预期类型。”
最佳答案
这里一切都是失败的,网站甚至可以返回 200 但什么也不返回,数据可能会损坏,并且,在您的情况下,我尝试调用您正在使用的 URL,发现它实际上是 XML,所以。 ..你有什么问题吗?
一个更强大的方法(假设您仍然想解析 JSON,也许来自另一个站点? The ISS has an open API )是使用 if let
来解开选项,然后在 else 情况下处理错误,而不是!
您的成功之路。
这是对所有内容的非常广泛的检查
task = session.dataTaskWithRequest(NSURLRequest(URL: url), completionHandler: { [unowned self] (data, response :NSURLResponse!, errorRequest) -> Void in
// Check the HTTP Header
if let responseHTTP = response as? NSHTTPURLResponse
{
if responseHTTP.statusCode != 200
{
println("Received status code \(responseHTTP.statusCode)")
return
}
}
else
{
println("Non-HTTP Response received")
return
}
var errorParsing : NSError?
if let JSON = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.allZeros, error: &errorParsing) as? NSDictionary
{
// Do the parsing
}
else
{
println("Error parsing: \(errorParsing)")
}
})
task!.resume()
关于json - 在 Swift 中处理 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28821949/