无法调用 'jsonObjectWithData'

cannot invoke 'jsonObjectWithData'

我不知道如何解决这个问题。

这来自一个构建简单天气应用程序的 youtube 教程。 该教程是在 2015 年 3 月上传的,因此是用 Swift 的早期版本编写的,在那里它可以工作,而当前的 Swift 2 它没有。

我得到的错误是:"cannot invoke 'jsonObjectWithData' with an argument list of type '(NSData, options: nil, error: NSError)'"

func getWeatherData(urlString:String) {

    let url = NSURL(string: urlString)

    let task = NSURLSession.sharedSession().dataTaskWithURL(url!){ (data, response, error) in
        dispatch_async(dispatch_get_main_queue(), {

        self.setLabels(data)

        })

    }

    task.resume()

}

func setLabels(weatherData: NSData) {

    var jsonError: NSError

    let json = NSJSONSerialization.JSONObjectWithData(weatherData, options: nil, error: jsonError)

    if let name = json["name"] as? String {

        self.ResultLabel.text = name
    }
}

您需要使用 & 将错误指针传递到 NSJSONSerialization.JSONObjectWithData(...)

let json = NSJSONSerialization.JSONObjectWithData(weatherData, options: nil, error: &jsonError) // &jsonError points to the NSErrorPointer of the NSError object

试试这个:

var jsonError: NSError?
let json = NSJSONSerialization.JSONObjectWithData(weatherData, options: nil, error: &jsonError)

如果你想让这段代码为 Swift 2 做好准备,你必须 运行 JSONParser with try 并捕获可能的错误。

private func httpGetRequest(request: NSURLRequest!, callback: (NSData?, String?) -> Void) {
    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithRequest(request){
        (data, response, error) -> Void in
        if error != nil {
            callback(nil, error!.localizedDescription)
        } else {
            callback(data, nil)
        }
    }
    task!.resume()
}

func setLabels(weatherData: NSData) {
    do {
        let json = try NSJSONSerialization.JSONObjectWithData(weatherData, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
        if let name = json["name"] as? String {
            self.resultLabel.text = name
        }
    } catch {
        print(error)
        self.resultLabel.text = "Lorem Ipsum"
    }
}

func loadWeatherData() {
    let weatherRequest = NSMutableURLRequest(URL: NSURL(string: "Your URL String goes here")!)
    httpGetRequest(weatherRequest){
        (data, error) -> Void in
        if error != nil {
            print("Error: \(error)")
        } else {
            self.setLabels(data!)
        }
    }
}

希望能帮助您解决问题。

在Swift3中,您可以使用以下代码修复相同的错误:

do{
   let jsonData = try JSONSerialization.jsonObject(with: (data)!, options: JSONSerialization.ReadingOptions.mutableContainers) as! [String: AnyObject]
}catch{
   print("Error while parsing JSON: Handle it")
}

在 swift 3.0 和 Swift 4.2 中 试试这个...

    do   {

let jsonData = try JSONSerialization.data(withJSONObject: your array or dictionary, options: JSONSerialization.WritingOptions()) as Data

let json = try JSONSerialization.jsonObject(with: jsonData as Data, options: JSONSerialization.ReadingOptions(rawValue: UInt(0)))

 }

 catch
{
}

在 swift 3 你可以试试这个:

func setLabels(weatherData: NSData) {
        do {
            var jsonError: NSError
            let json = try JSONSerialization.jsonObject(with: weatherData as Data, options: []) as! NSDictionary

            if let name = json["name"] as? String {
                self.ResultLabel.text = name
            }
        } catch {

        }

    }