У меня есть эта функция:Преобразования 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"];
Я как бы потерялся здесь.
Любая помощь будет оценена по достоинству.
С уважением.
@ luk2302 проблемы заключается в том, что ответ JSON является stringify, в в офисе мы делаем это все время с помощью JavaScript и C#, но у меня проблемы с iOS –
@ luk2302 здесь у вас есть лучшее объяснение того, что мы делаем: http://www.allannienhuis.com/archives/2015/02/ 04/beware-json-stringify/ –
Я только что написал тестовую программу, которая десериализует вашу примерную строку. Работает отлично. Я заметил, что встроенные unicode-экраны не были декодированы. Наверное, нужно их отменить. – Avi