Невозможно разобрать JSON - PullRequest
       10

Невозможно разобрать JSON

1 голос
/ 07 февраля 2012

Я пытаюсь разобрать json, возвращенный твиттером.JSON извлекается хорошо, и я преобразую его в NSDictionary,

NSLog для словаря объекта работает хорошо и показывает все твиты.

NSLog(@"Twitter response: %@", dict);

, но получаю следующую ошибку, когда я пытаюсь получить objectForKey длялюбой ключ в объекте dict:

2012-02-07 15: 35: 28.988 TestTweetApp [1525: 12103] - [__NSCFArray objectForKey:]: нераспознанный селектор, отправленный экземпляру 0x6a2a370 [Переключение на процесс 1525 потока0x12103] [Переключение на процесс 1525 thread 0x12103] 2012-02-07 15: 35: 28.997 TestTweetApp [1525: 12103] * Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '- [__ NSCFArray objectForKey:]:нераспознанный селектор отправлен в экземпляр 0x6a2a370 '* стек вызовов первого выброса: (0x176e052 0x1a40d0a 0x176fced 0x16d4f00 0x16d4ce2 0x3044 0xd306 0x2048445 0x2049ecf 0x2049d28 0x0-x3 * 0x2-x3 * 0x2-x * 0 * * * 0 * * 0 * * * ** код для функции viewDidLoad ():

- (void)viewDidLoad
{
    [super viewDidLoad];

    TWRequest *request = [[TWRequest alloc] initWithURL:[NSURL URLWithString: @"https://api.twitter.com/1/statuses/public_timeline.json?screen_name=[SOME_USER_NAME]&include_entities=true"] parameters:nil requestMethod:TWRequestMethodGET];

    [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error)
    {
        if ([urlResponse statusCode] == 200) 
        {
            NSError *error;  

            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];

            NSLog(@"Twitter response: %@", [dict objectForKey:@"entities"]);
        }
        else
            NSLog(@"Twitter error, HTTP response: %i", [urlResponse statusCode]);
    }];

}

Ответы [ 2 ]

2 голосов
/ 07 февраля 2012

Если вы не уверены в формате ответа или у вас может быть несколько возможных форматов ответа, и если вам также необходимо обрабатывать ошибки, вы можете использовать любой из методов самоанализа, например isKindOfClass или respondsToSelector, чтобы определить тип, возвращаемый JSONObjectWithData

id responseData = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];

if([responseData respondsToSelector:@selector(objectForKey:)]){
   //Response is of type NSdictionary
   NSLog(@"Twitter response: %@", [responseData objectForKey:@"entities"]);
}else if ([responseData respondsToSelector:@selector(objectAtIndex:)]){
        //Response is of type NSArray
      }
      else{
         // error 
      }
2 голосов
/ 07 февраля 2012

Кажется, что ваш ответ NSArray вместо NSDictionary. Попробуйте

NSLog(@"%@", [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error]);

до вашего

NSDictionary *dict... 

и посмотрите формат. Затем переместите его в NSArray и получите доступ к элементам должным образом.

NSArray *response = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];
NSLog(@"elements = %@", response);
...