json - 在 Swift 中处理 JSON

标签 json swift

我正在尝试学习 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/

相关文章:

ios - 在 Objective-C 中将 JSON 映射到 NSDictionary

xcode - 为什么我的计时器在 Swift 中不倒计时到 0?

ios - 如何将 UILabel 文本格式化为特定于语言环境的 NSNumberFormatterStyle.DecimalStyle

swift - 为什么符合 Strideable 会改变乘法的计算方式?

swift - Clean Swift 架构中 Worker 的实现

javascript - 以 JSON 格式提交表单数据

java - Mustache.java 传递 json 字符串

java - Spring MVC - 将 JSON 对象从 Ajax post 请求映射到 Java 对象

ios - 如何根据键入的文本增加文本字段的宽度?

javascript - 使用变量访问 JSON 值