2016-05-03 8 views
0

NSJSonSerializationで有効なJSONを返すレスポンスを解析しようとしています。しかし、エラーなしでnilを返します。別のJSONレスポンスで動作します。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": "" 
    } 
    ] 
} 
+0

私のJSONは – AnthonyR

+0

は' [[ANYOBJECT]文字列]にキャストすることはできません結果のように思える非常に大きいです。私はそれがトップレベルの配列だと思います。 – werediver

+2

JSONの先頭(約20文字)で型を識別できます。 – vadian

答えて

5

タイプではありません[String: [AnyObject]]

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

     } 

をお試しください[String: AnyObject]です

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

他の場所からコピーしたコードブロックをダンプするだけではありません。これは有効な答えではありません。コードは質問に適合しなければならず、コードが何をするのか説明を追加する必要があります。 – Moritz

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]] { 
     ... 
    } 
} 
関連する問題