2015-03-08 4 views
2

Я извлекаю некоторую информацию из базы данных MYSQL с помощью службы php. В конце я проталкиваю его через echo json_encode($resultArray) в свое приложение. Теперь у меня проблема с JSONSerialization, и вот мой код.JSONSerialization и EXC_BAD_ACCESS

If (urlData != nil) { 
     let res = response as NSHTTPURLResponse!; 

     NSLog("Response code: %ld", res.statusCode); 

     if (res.statusCode >= 200 && res.statusCode < 300) 
     { 
      var responseData:NSString = NSString(data:urlData!, encoding:NSUTF8StringEncoding)! 

      NSLog("Response ==> %@", responseData); 

      var error: NSError? 

      let jsonData2:NSDictionary = NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers , error: &error) as NSDictionary 

      let success:NSInteger = jsonData2.valueForKey("IdUser") as NSInteger 
      ... 

С помощью этого кода я получаю сообщение об ошибке EXC_BAD_ACCESS в строке NSJSONSerialization. Кто-нибудь знает, почему?

responseDate имеют этот пример значение:

[{"IdUser":"2","preName":"Max","lastName":"Muster"}] 

Спасибо заранее.

+0

Я нашел решение. Сериализация не работает, когда в данных ответа есть некоторые скобки. Это нормально или есть способ справиться с этим в xcode? –

+0

Покажите нам данные ответа. И скажите нам, что возвращает ошибка NSJSONSerialization. –

ответ

0

простой способ для разбора JSON в быстром использовании SwiftyJSON, но если вы не хотите, вы можете сделать это

if let jsonData2 = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(0), error: nil) as? AnyObject { 

     } 

, но я настоятельно рекомендую использовать SwiftyJSON

+1

Если вы не хотите пытаться сортировать объекты SwiftyJSON - вам нужно преобразовать обратно в NSArray/NSDictionionary. Это очень медленно ... Я фактически прекратил использовать SwiftyJSON из-за этого. Нативные объекты намного быстрее. Если вам нужно сортировать, не используйте Swifty JSON! – Eamorr

1

Ваш ответ JSON не NSDictionary. Это массив. Теперь у этого массива есть один элемент, который, сам, словарь. Но вы должны разобрать массив первым:

let array = NSJSONSerialization.JSONObjectWithData(urlData!, options:nil, error: &error) as NSArray 

Если вы хотите получить словарь, захватить первый элемент из массива:

let dictionary = array[0] as NSDictionary 

И если вы хотите, чтобы значение поля из IdUser, вы хватаете это значение строки, а затем вызвать integerValue:

let idUser = dictionary["IdUser"]?.integerValue 

Кстати, если вообще возможно, что ответ может отклоняться в своем формате, вы можете быть осторожны с вашим анализом ответа, используя необязательную привязку, чтобы изящно обрабатывать отсутствие данных в ожидаемом формате, например:

var error: NSError? 
if let array = NSJSONSerialization.JSONObjectWithData(urlData!, options:nil, error: &error) as? [[String: AnyObject]] { 
    if let dictionary = array.first { 
     if let idUser = dictionary["IdUser"]?.integerValue { 
      // `IdUser` definitely found; now check the value here 
     } 
    } 
} 
Смежные вопросы