2016-01-20 2 views
0

У меня есть эта функция:Преобразования NSString в формат JSON с NSJSONSerialization не работают

- (void)checkLogin:(NSString *)pLogin andPassword:(NSString*) pPassword { 
    //Create the data object. 
    NSMutableDictionary *tLoginAndPasword = [NSMutableDictionary dictionaryWithObjectsAndKeys:pLogin,@"Login",pPassword,@"Password", nil]; 
    NSMutableDictionary *tData = [NSMutableDictionary dictionaryWithObjectsAndKeys:[_Util serializeDictionary:tLoginAndPasword],@"Data", nil]; 
    //Call the login method. 
    NSData *tResponse = [_Util getLogin:tData]; 
    if (tResponse != Nil) { 
     _oLabelErrorLogin.hidden = YES; 
     [_Util setUser:pLogin andPassword:pPassword]; 
     NSMutableDictionary *tJSONResponse =[NSJSONSerialization JSONObjectWithData:tResponse options:kNilOptions error:nil]; 
     NSString *tPayload = [tJSONResponse objectForKey:@"Payload"]; 
     if([[tJSONResponse objectForKey:@"StatusCode"] isEqual: @"424"]) { 
      //Set global values. 
      NSData *tPayloadData = [tPayload dataUsingEncoding:NSUTF8StringEncoding]; 
      if ([NSJSONSerialization isValidJSONObject:tPayloadData]) { 
       _Payload = [NSJSONSerialization JSONObjectWithData:tPayloadData options:kNilOptions error:nil]; 
       _RowCount = _Payload.count; 
      } else { 
       NSLog(@"JSON Wrong String %@",tPayload); 
      } 
     } else if([[tJSONResponse objectForKey:@"StatusCode"] isEqual: @"200"]){ 
      _Payload = Nil; 
     } 
    } else { 
     //Set global values. 
     _Payload = Nil; 
     _oLabelErrorLogin.hidden = NO; 
     //Clear login data. 
     _oLogin.text = @""; 
     _oPassword.text = @""; 
     [_Util setUser:@"" andPassword:@""]; 
    } 
} 

Ответ JSON выглядит следующим образом:

{ 
    "Payload": "{\"UserName\":\"Marco Uzcátegui\",\"Clients\":[{\"UserProfileId\":4,\"ProfileName\":\"Platform Administrator\",\"ClientName\":\"Smart Hotel Platform\",\"InSession\":true},{\"UserProfileId\":5,\"ProfileName\":\"Administrator\",\"ClientName\":\"La Moncloa de San Lázaro\",\"InSession\":false},{\"UserProfileId\":6,\"ProfileName\":\"Administrator\",\"ClientName\":\"Jardín Tecina\",\"InSession\":false}]}", 
    "StatusCode": "424", 
    "StatusDescription": null 
} 

Как вы можете видеть, у меня есть сбежавшая строка внутри " Полезная нагрузка ", который является правильным JSON, поэтому я хочу сгенерировать еще один NSMutableDictionary с этой строкой, поэтому я делаю это:

NSData *tPayloadData = [tPayload dataUsingEncoding:NSUTF8StringEncoding]; 
if ([NSJSONSerialization isValidJSONObject:tPayloadData]) { 
    _Payload = [NSJSONSerialization JSONObjectWithData:tPayloadData options:kNilOptions error:nil]; 
    _RowCount = _Payload.count; 
} else { 
    NSLog(@"JSON Wrong String %@",tPayload); 
} 

Итак, я создаю NSData из NSString и спрашиваю, действительно ли это, он всегда возвращает false.

Я попытался заменить «\» на строку и не работает.

[tPayload stringByReplacingOccurrencesOfString:@"\\\"" withString:@""] 

Я попытался создать NSMutableDictionary со строкой, но результат не является словарем.

NSMutableDictionary *tPayload = [tJSONResponse objectForKey:@"Payload"]; 

Я как бы потерялся здесь.

Любая помощь будет оценена по достоинству.

С уважением.

+0

@ luk2302 проблемы заключается в том, что ответ JSON является stringify, в в офисе мы делаем это все время с помощью JavaScript и C#, но у меня проблемы с iOS –

+0

@ luk2302 здесь у вас есть лучшее объяснение того, что мы делаем: http://www.allannienhuis.com/archives/2015/02/ 04/beware-json-stringify/ –

+0

Я только что написал тестовую программу, которая десериализует вашу примерную строку. Работает отлично. Я заметил, что встроенные unicode-экраны не были декодированы. Наверное, нужно их отменить. – Avi

ответ

1

Проблема эта линия

[NSJSONSerialization isValidJSONObject:tPayloadData] 

Из документации isValidJSONObject

Возвращает логическое значение, указывающее, может ли данный объект будет преобразуется в данные JSON.

данный объект означает NSArray или NSDictionary но неNSData

Удалить эту проверку и осуществлять параметр ошибки в JSONObjectWithDataoptions:error:

1

Метод NSJSONSerialization.isValidJSONObject: проверяет, является ли объект (например, NSDictonary или NSArray экземпляр) могут быть преобразованы в JSON. Он не проверяет, может ли экземпляр NSData быть преобразован от JSON. Для NSData он всегда будет возвращать false.

Так что просто позвоните NSJSONSerialization.JSONObjectWithData:options: и проверьте результат.

Смежные вопросы