0

sbjson を使用して、Twitter の GET trend/:woeid への呼び出しによって返される次の json を解析するときに発生する問題を理解しようとしています。

次の 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];

これは、現在非推奨となっている Twitter の GET トレンド コールを対象としていたため、破損しているサンプル コードです。コードは、最初の「[」と最後の「]」を手動で削除した場合にのみ機能します。ただし、これらの文字を応答から削除しないと、パーサーは1 つのNSString 要素の NSArray を返します: json 応答です。

この応答を正しく解析するにはどうすればよいですか。前もって感謝します。

4

1 に答える 1

2

私は自分で問題を解決しました.NSArrayが文字列のように見える要素を1つだけ返すことに混乱しました。

配列内の 1 つの要素は 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];

Apple が提供する、新しくリリースされた NSJSONSerialization を使用すると、少しすっきりします。

- (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];
}
于 2011-11-02T12:03:38.683 に答える