Eric
Eric

Reputation: 21

cannot invoke 'jsonObjectWithData'

I cannot figure out how to solve this issue.

This comes from a youtube tutorial to build a simple Weather App. The tutorial was uploaded in March 2015 and therefor written in a previous version of Swift, there it worked, with the current Swift 2 it doesn't.

The error I get is: "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
    }
}

Upvotes: 1

Views: 3355

Answers (6)

srinivas k
srinivas k

Reputation: 21

in swift 3.0 and Swift 4.2 try this ...

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

Upvotes: 1

Jesus Antonio Ramos
Jesus Antonio Ramos

Reputation: 1

In swift 3 you can try this:

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 {

        }

    }

Upvotes: 0

Naishta
Naishta

Reputation: 12353

In Swift 3, you can fix the same error with the code below:

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

Upvotes: -1

Subbu
Subbu

Reputation: 2148

Try this:

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

Upvotes: 1

cr0ss
cr0ss

Reputation: 543

if you want to get this code ready for Swift 2, you have to run the JSONParser with try and catch possible errors.

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

Hope that will help to solve your Problems.

Upvotes: 3

JAL
JAL

Reputation: 42449

You need to pass the error pointer into NSJSONSerialization.JSONObjectWithData(...) with &.

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

Upvotes: 0

Related Questions