NSJSONSerialization使用有效的json返回nil

时间:2016-05-03 08:27:27

标签: ios json swift

我尝试解析一个使用NSJSonSerialization返回有效JSON的响应。但它返回nil没有错误。它适用于另一个JSON响应。

我做了一些搜索,这可能是JSON编码的问题。我不知道如何解决它。任何的想法 ?

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

我的json回应:

{
  "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": ""
    }
  ]
}

3 个答案:

答案 0 :(得分:5)

JSON的类型为[String: AnyObject]而不是[String: [AnyObject]]

答案 1 :(得分:0)

我认为这是问题所在:

as? [String: [AnyObject]]

尝试删除演员。 如果您的JSON正确并且没有验证错误,您获得的词典可能具有任意类型的键值。您可以尝试仅使用所需的值键来使用字典:

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

答案 2 :(得分:-1)

试试这个

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)

        }

如果数据是数组类型使用此代码

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