Проблема парсинга SBJSON с тенденциями GET в Твиттере /: woeid - PullRequest
0 голосов
/ 02 ноября 2011

Я пытаюсь понять проблему, возникающую при использовании sbjson для анализа следующего json, возвращенного при вызове тенденций GET в Twitter /: woeid

Я использую следующий URL: @ "http://api.twitter.com/1/trends/1.json"и я получаю следующий ответ: (усеченный для экономии места)

[  
  {  
    "trends": [  
      {  
        "name": "Premios Juventud",  
        "url": "http://search.twitter.com/search?q=Premios+Juventud",  
        "query": "Premios+Juventud"  
      },  
      {  
        "name": "#agoodrelationship",  
        "url": "http://search.twitter.com/search?q=%23agoodrelationship",  
        "query": "%23agoodrelationship"  
      }  
    ],  
    "as_of": "2010-07-15T22:40:45Z",  
    "locations": [  
      {  
        "name": "Worldwide",  
        "woeid": 1  
      }  
    ]  
  }  
]  

Вот код, который я использую для анализа и отображения имени и URL:

NSMutableString *content = [[NSMutableString alloc] initWithBytes:[responseData bytes] length:[responseData length] encoding:NSUTF8StringEncoding];

[content replaceCharactersInRange:NSMakeRange(0, 1) withString:@""];
[content replaceCharactersInRange:NSMakeRange([content length]-1, 1) withString:@""];
NSLog(@"Content is: %@", content);

SBJsonParser *parser = [[SBJsonParser alloc] init];
NSDictionary *json = [parser objectWithString:content];


//NSArray *trends = [json objectForKey:@"trends"];
NSArray *trends = [json objectForKey:@"trends"];
for (NSDictionary *trend in trends)
{
    [viewController.names addObject:[trend objectForKey:@"name"]];
    [viewController.urls addObject:[trend objectForKey:@"url"]];
}

[parser release];

Этопример кода, который не работает, потому что он был нацелен на вызов трендов GET в Твиттере, который сейчас устарел. Код будет работать только в том случае, если я вручную удаляю первый '[' и последний ']'. Однако если я не удаляю эти символы изВ ответ парсер возвращает NSArray из один NSString элемент: ответ json.

Как правильно проанализировать этот ответ. Заранее спасибо.

1 Ответ

2 голосов
/ 02 ноября 2011

Я решил эту проблему сам, меня смутило возвращение NSArray только с одним элементом, который оказался строкой.

Один элемент в массиве был не строкой NSSt, а NSDictionary. Как только я понял это, я мог правильно подойти к данным, назначив элемент NSDictionary, а затем получив доступ к данным «трендов» с помощью соответствующего ключа:

NSMutableString *content = [[NSMutableString alloc] initWithBytes:[responseData bytes] length:[responseData length] encoding:NSUTF8StringEncoding];

SBJsonParser *parser = [[SBJsonParser alloc] init];
NSArray *json = [parser objectWithString:content];

NSDictionary *trends = [json objectAtIndex:0];
for (NSDictionary *trend in [trends objectForKey:@"trends"])
{
    [viewController.names addObject:[trend objectForKey:@"name"]];
    [viewController.urls addObject:[trend objectForKey:@"url"]];
}

[parser release];

Это немного чище, используя недавно выпущенный NSJSONSerialization, предоставленный Apple:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{ 
    NSArray *json = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:nil];    

    NSDictionary *trends = [json objectAtIndex:0];
    for (NSDictionary *trend in [trends objectForKey:@"trends"])
    {
        [viewController.names addObject:[trend objectForKey:@"name"]];
        [viewController.urls addObject:[trend objectForKey:@"url"]];
    }    

    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    [viewController.serviceView reloadData];
}
...