AnthonyR
AnthonyR

Reputation: 3545

NSJSONSerialization return nil with a valid json

I try to parse a response which return a valid JSON with NSJSonSerialization. But it returns nil with no error. It works with another JSON response.

I did some search, and this could be a problem with the encoding of the JSON. I don't know how to solve it. Any idea ?

let url: NSURL = NSURL(string: urlPath)!
        self.searchRequest = NSMutableURLRequest(URL: url)
        if let searchRequest = self.searchRequest {
            searchRequest.HTTPMethod = "GET"
            let authString : String = SNCF.APIKey + ":" + ""
            let authData : NSData = authString.dataUsingEncoding(NSASCIIStringEncoding)!
            let authValue : String = "Basic " + authData.base64EncodedStringWithOptions(.EncodingEndLineWithCarriageReturn)
            searchRequest.setValue(authValue, forHTTPHeaderField: "Authorization")

            let queue:NSOperationQueue = NSOperationQueue()
            NSURLConnection.sendAsynchronousRequest(searchRequest, queue: queue, completionHandler:{ (response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in

            do {
//HERE JSONRESULT WILL BE NIL
                if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? [String: [AnyObject]] {
                    print("ASynchronous\(jsonResult)")
                    if let places = jsonResult["stop_areas"] as? [[String:AnyObject]]{
                        for placeDictionary in places {
                            if let labelText = placeDictionary["label"] as? String {
                                self.resultDatasource.append(labelText)
                            }
                        }
                        self.resultTableView.reloadData()
                    }
                }
//HERE NO ERROR IS CATCHED
            } catch let error as NSError {
                print(error.localizedDescription)
            }
        })

Piece of my json response :

{
  "disruptions": [],
  "pagination": {
    "start_page": 0,
    "items_on_page": 100,
    "items_per_page": 100,
    "total_result": 3053
  },
  "stop_areas": [
    {
      "codes": [
        {
          "type": "CR-CI-CH",
          "value": "0080-251967-BV"
        }
      ],
      "name": "gare de Perl",
      "links": [],
      "coord": {
        "lat": "0",
        "lon": "0"
      },
      "label": "gare de Perl",
      "timezone": "Europe/Paris",
      "id": "stop_area:OCE:SA:80251967"
    },
    {
    ...
    },
    //stop_areas dictionaries object...
], //end stop_areas array of dictionaries
"links": [
    {
      "href": "https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}",
      "type": "stop_areas",
      "rel": "stop_areas",
      "templated": true
    },
    {
      "href": "https://api.sncf.com/v1/coverage/sncf/stop_areas?start_page=1",
      "type": "next",
      "templated": false
    },
    {
      "href": "https://api.sncf.com/v1/coverage/sncf/stop_areas?start_page=30.52",
      "type": "last",
      "templated": false
    },
    {
      "href": "https://api.sncf.com/v1/coverage/sncf/stop_areas",
      "type": "first",
      "templated": false
    }
  ],
  "feed_publishers": [
    {
      "url": "",
      "id": "sncf",
      "license": "",
      "name": ""
    }
  ]
}

Upvotes: 0

Views: 820

Answers (3)

Nishant Chandwani
Nishant Chandwani

Reputation: 445

Try This

do {
          if  let jsonResult: Dictionary = try NSJSONSerialization.JSONObjectWithData(self.mutableData, options: NSJSONReadingOptions.MutableContainers) as? Dictionary<String, AnyObject>
          {
        // print("get Read messages == \(jsonResult)");
        if ((jsonResult["Warning"]) != nil)
        {
            let error_by_wc: NSString  = jsonResult["Warning"] as! String
            //print("results == \(error_by_wc)");
            // printMessage("\(error_by_wc)")
            JLToast.makeText("\(error_by_wc)").show()



        }else if((jsonResult["Error"]) != nil)
        {
            let error_by_wc: NSString  = jsonResult["Error"] as! String
            // print("results == \(error_by_wc)");
            // printMessage("\(error_by_wc)")
            JLToast.makeText("\(error_by_wc)").show()

        }
        else
        {
           // read message s


        }
        } catch {

            print(error)

        }

If Data is Array Type Use this code

do {
                if let jsonResult:NSArray = try NSJSONSerialization.JSONObjectWithData(self.mutableData, options: .MutableContainers) as? NSArray {




                //print(jsonResult)

                aDataBase.insertFromUserImage(jsonResult)

                connection_allMEssages()



            }else
            {
                //print("not data found")
                BProgressHUD.dismissHUD(0)
            }
            } catch {

                print(error)
                BProgressHUD.dismissHUD(0)
            }

Upvotes: -1

Horatiu
Horatiu

Reputation: 151

I think this is the problem:

as? [String: [AnyObject]]

Try to remove the cast. If your JSON is correct and has no validation errors, the dictionary you get probably has the key value of type Any. You can try to use the dictionary by only casting the value keys you want:

if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: nil) {
   print("ASynchronous\(jsonResult)")
   if let places = jsonResult["stop_areas"] as? [[String:AnyObject]] {
      ...
   }
}

Upvotes: 0

vadian
vadian

Reputation: 285069

The type of the JSON is [String: AnyObject] not [String: [AnyObject]]

Upvotes: 5

Related Questions