#objective-c #ios #sbjson
#objective-c #iOS #sbjson
Вопрос:
Я пытаюсь понять проблему, с которой я сталкиваюсь при использовании sbjson для анализа следующего json, возвращаемого вызовом GET trends в 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=#agoodrelationship",
"query": "#agoodrelationship"
}
],
"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 trends в Twitter, который теперь устарел. Код будет работать, только если я вручную удалю первый ‘[‘ и последний ‘]’. Однако, если я не удалю эти символы из ответа, анализатор вернет NSArray одного элемента NSString: ответ json.
Как мне правильно проанализировать этот ответ. Заранее спасибо.
Ответ №1:
Я сам решил проблему, меня смутило, что NSArray возвращается только с одним элементом, который оказался строкой.
Один элемент в массиве был не NSString, а 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];
}