0

4月22日更新:

问题已解决:原来 API 需要 OAUTH 才能工作……这解释了为什么它会在浏览器中正确加载(我已经登录),而不是在 JSON 验证器或我自己的应用程序等其他应用程序中。

我正在尝试编写一个类,它将在 Lion 上的 Xcode 4.3.2 中获取和解析 JSON 文件。我只写了几个星期的代码,如果这是一个有点愚蠢的问题,我很抱歉!代码似乎工作正常,除了只有 JSON 文件中的前 20 个条目显示(应该有 200 个)。知道为什么会这样吗?

   - (void) initJSON
{
NSString *urlstri = [[NSString alloc] initWithFormat:@"http://api.t.sina.com.cn/statuses/followers.json?source=?????&count=200&screen_name=%@", userName];
NSURL *newURL = [[NSURL alloc] initWithString:urlstri];
NSURLRequest *request = [NSURLRequest requestWithURL:newURL];

[NSURLConnection sendAsynchronousRequest:request 
                                   queue:[NSOperationQueue mainQueue] 
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
       [self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:NO];
                   }
       ];}
- (void) fetchedData:(NSData *)responseData {
//parse out the json data
NSError* error;
NSDictionary* json = [NSJSONSerialization 
                      JSONObjectWithData:responseData //1

                      options:kNilOptions 
                      error:&error];


NSArray* newestFollower = [json objectForKey:@"users"]; //2
fnumber = 0;
mnumber = 0;

int arraySize = [newestFollower count];
NSLog(@"%i",arraySize);

for (i=0; i<arraySize; ++i) {
    NSDictionary* userProfile = [newestFollower objectAtIndex: i];
    NSString* userGender = [userProfile objectForKey:@"gender"];
    //NSLog(@"%@", userGender);
    if([userGender isEqualToString:@"m"]){
        //NSLog (@"man");
        ++mnumber;
    }
    if([userGender isEqualToString:@"f"]){
        //NSLog(@"notman");
        ++fnumber;}
}

mOutput = [NSNumber numberWithInt:(mnumber)];
fObj = [NSString stringWithFormat:@"%i", fnumber];
mObj = [NSString stringWithFormat:@"%i", mnumber];
NSLog (@"Boys:%@", mObj);
NSLog (@"Girls:%@", fObj);
4

2 回答 2

0

我不知道这是否能解决您的问题,但您可以尝试使用 anNSURLConnection而不是同步NSData dataWithContentsofURL方法异步请求数据。

它看起来像这样:

- (void) initJSON
{
    NSString *urlstri = [[NSString alloc] initWithFormat:@"http://api.t.sina.com.cn/statuses/followers.json?source=??????&count=200&screen_name=%@", userName];
    NSURL *newURL = [[NSURL alloc] initWithString:urlstri];
    NSURLRequest *request = [NSURLRequest requestWithURL:newURL];

    [NSURLConnection sendAsynchronousRequest:request 
                                       queue:[NSOperationQueue mainQueue] 
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
            [self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:NO];
    }];
}
于 2012-04-19T17:06:49.800 回答
0

编码可能存在问题。解析时某些字符可能会出现问题(我过去在 HTMLParser 库中遇到过这种情况)。

首先,您可以尝试设置不同的编码器。如果这不起作用,也许从内容字符串中替换有问题的字符。在过去的项目中,由于 HTML 解析器的问题,我使用了以下内容:

NSString *contents = [[NSString alloc] initWithData:data encoding:NSWindowsCP1252StringEncoding];

// for parsing this weird char has te be removed, else will only parse partially ...
contents = [contents stringByReplacingOccurrencesOfString:@"Ó" withString:@"O"]; 

data = [contents dataUsingEncoding:NSWindowsCP1252StringEncoding];

可悲的是,我无法找到更清洁的解决方案。

您应该尝试弄清楚您的内容是否有一些无法正确解析的特殊字符,并在解析之前从这些特殊字符中“清除”内容。

PS:来自Apple关于JSON序列化程序的文档

数据必须采用 JSON 规范中列出的 5 种支持的编码之一:UTF-8、UTF-16LE、UTF-16BE、UTF-32LE、UTF-32BE。数据可能有也可能没有 BOM。用于解析的最有效编码是 UTF-8,因此如果您可以选择对传递给此方法的数据进行编码,请使用 UTF-8。

于 2012-04-19T18:00:13.300 回答