Как вернуть необработанную строку text / json из aspnet mvc и проанализировать ее с помощью библиотеки iPhone JSON - PullRequest
0 голосов
/ 14 января 2011

У меня есть веб-сервис, который возвращает необработанную строку данных JSON (пример ниже)

{'d':{'success':true,'msg':null,'data':[{'productId':'4b7fcb0f818e4a4abaf5b3c78654b631','id':4283}]}}

... И когда я пытаюсь проанализировать этот JSON с помощью популярной библиотеки JSON для разработки на iPhone, я замечаю проблему в следующем методе

- (id)objectWithString:(NSString *)repr {
    [self clearErrorTrace];

    if (!repr) {
        [self addErrorWithCode:EINPUT description:@"Input was 'nil'"];
        return nil;
    }

    depth = 0;
    c = [repr UTF8String];

    id o;
    if (![self scanValue:&o]) {
        return nil;
    }
// more code ...
}

Когда я нажимаю последний показанный оператор if, я показываю, что c является действительным символом (показывая значения json внутри, как и ожидалось), но я замечаю, что после определения o я возвращаю nil внутри этого последнего, если вызывает эту ошибку из библиотеки

#import "NSString+SBJSON.h"
#import "SBJsonParser.h"

@implementation NSString (NSString_SBJSON)

- (id)JSONValue
{
    SBJsonParser *jsonParser = [SBJsonParser new];
    id repr = [jsonParser objectWithString:self];
    if (!repr)
        NSLog(@"-JSONValue failed. Error trace is: %@", [jsonParser errorTrace]);
    [jsonParser release];
    return repr;
}

@end

Есть идеи, что может быть не так с тем, чтобы взять строку, похожую на json, и попытаться разобрать ее, как показано ниже?

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    [connection release];

    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    [responseData release];

    NSArray *json = [responseString JSONValue]; //here it all fails
}

Так же, как примечание - это работает без ошибок, когда я запрашиваю допустимый веб-сервис json от крупной компании. Мое приложение aspnet mvc и обратная строка просто

return this.Content(jsonStringValue, "text/json");

Ответы [ 2 ]

3 голосов
/ 14 января 2011

Вы должны использовать встроенный объект результата JSON из вашего метода действия вместо Content() метода:

return Json(data);

Он автоматически сериализует ваш объект, чтобы быть действительным JSON.

1 голос
/ 14 января 2011

Было бы полезно предоставить фактические сообщения об ошибках / следы.

В любом случае, ваша строка JSON недопустима: строка в JSON заключена в двойные, а не в одинарные кавычки. Следующее является действительным JSON:

{"d":{"success":true,"msg":null,"data":[{"productId":"4b7fcb0f818e4a4abaf5b3c78654b631","id":4283}]}}

Редактировать: обратите внимание, что ваши данные JSON (верхнего уровня) представляют объект, а не массив. Следовательно

NSArray *json = [responseString JSONValue];

следует заменить на

NSDictionary *json = [responseString JSONValue];

потому что SBJSON представляет объекты JSON в виде словарей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...