无法调用' jsonObjectWithData'

时间:2015-07-02 18:11:57

标签: ios json nsjsonserialization swift2

我无法弄清楚如何解决这个问题。

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

我得到的错误是:"无法调用' jsonObjectWithData'使用类型'的参数列表(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
    }
}

6 个答案:

答案 0 :(得分:3)

如果你想为Swift 2准备好这个代码,你必须运行JSONParser并尝试捕获可能的错误。

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!)
        }
    }
}

希望这有助于解决您的问题。

答案 1 :(得分:1)

试试这个:

/Data Dictionary/Web Scripts/org/alfresco

答案 2 :(得分:1)

在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
{
}

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

在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 {

        }

    }

答案 5 :(得分:-1)

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

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