Не удается разобрать Json на NSDictionary

У меня есть WebService, который возвращает мне следующую Json-String:

"{\"password\" : \"1234\",  \"user\" : \"andreas\"}"

Я вызываю веб-сервис и пытаюсь проанализировать возвращенные данные, например:

[NSURLConnection sendAsynchronousRequest: request
                                   queue: queue
                       completionHandler: ^(NSURLResponse *response, NSData *data, NSError *error) {


        if (error || !data) {
           // Handle the error
        } else {
           // Handle the success
           NSError *errorJson = nil;
           NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: &errorJson];
           NSString *usr = [responseDict objectForKey:@"user"];
        }
   }
 ];

Но результирующий NSDictionary выглядит так:

введите здесь описание изображения

Что влияет на то, что я не могу получить значения - например, user. Может кто-нибудь помочь мне, что я делаю неправильно? - Спасибо.


person BennoDual    schedule 24.06.2013    source источник
comment
Как вы определили, что такое строка JSON?   -  person Wain    schedule 24.06.2013
comment
По-видимому, это словарь в словаре.   -  person Hermann Klecker    schedule 24.06.2013
comment
Очевидно, это не совсем то, что дает вам веб-сервис. Каково значение data (желательно преобразованное в строку) перед анализом?   -  person Kevin    schedule 24.06.2013
comment
Ты прав! - Я делаю: [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public string doSomething(string email, string name) { return "{\"password\" : \"1234\", \"user\" : \"andreas\"}"; } и получаю: {d:{\password\ : \1234\, \user\ : \andreas\}} но почему?   -  person BennoDual    schedule 24.06.2013
comment
После прочтения этой ветки кажется, что вы лгали. То, что вы сказали, возвращал WebService, на самом деле было не тем, что он возвращал, а тем, что вы думали, что он возвращал. Не то же самое.   -  person gnasher729    schedule 27.03.2014


Ответы (1)


На снимке экрана отладчика кажется, что сервер (по какой-то причине) возвращает «вложенный JSON»: responseDict[@"d"] — это строка, снова содержащая данные JSON, поэтому вам нужно применить NSJSONSerialization дважды:

NSError *errorJson = nil;
NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData: data options:0 error: &errorJson];
NSData *innerJson = [responseDict[@"d"] dataUsingEncoding:NSUTF8StringEncoding];
NSMutableDictionary *innerObject = [NSJSONSerialization JSONObjectWithData:innerJson options:NSJSONReadingMutableContainers error:&errorJson];
NSString *usr = [innerObject objectForKey:@"user"];

Если у вас есть возможность, лучшим решением будет исправить веб-службу, чтобы она возвращала правильные данные JSON.

person Martin R    schedule 24.06.2013
comment
Ты прав. Но я не знаю, почему я получил неправильный результат от WebService. Это веб-сервис ASP.NET, и я делаю только: return "{\"password\" : \"1234\", \"user\" : \"andreas\"}"; - person BennoDual; 24.06.2013
comment
@ThomasKehl: я не могу на это ответить, я ничего не знаю об ASP.NET. - person Martin R; 24.06.2013
comment
@ThomasKehl: Очевидно, это просто то, что делает ASP.NET при обработке запросов AJAX. - person Chuck; 24.06.2013