Xcode Cocoa中的JSON解析仅显示前20个条目

Xcode Cocoa中的JSON解析仅显示前20个条目,xcode,json,macos,cocoa,parsing,Xcode,Json,Macos,Cocoa,Parsing,4月22日更新: 问题解决:原来API要求OAUTH工作。。。这解释了为什么它会正确加载到我已经登录的浏览器中,而不是其他应用程序中,比如JSON验证程序或我自己的应用程序中 我正在尝试编写一个类,该类将在Lion上的Xcode 4.3.2中获取并解析JSON文件。我只编写了几个星期的代码,如果这是一个有点愚蠢的问题,那么很抱歉!除了JSON文件中只有前20个条目显示为200个之外,代码似乎工作正常。知道为什么会这样吗 - (void) initJSON { NSString *urlst

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);

我不知道这是否能解决您的问题,但您可以尝试使用NSURLConnection异步请求数据,而不是使用synchronous 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];
    }];
}

编码可能有问题。在解析我以前使用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];
遗憾的是,我找不到更干净的解决办法

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

附注:来自苹果公司关于JSON序列化程序的文档

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


您是否尝试过将urlStri复制并粘贴到浏览器中,以验证服务器是否确实返回了您预期的200个项目?当您在代码中记录阵列大小时,是20还是200?谢谢您的快速回复。当我将URL复制到浏览器中时,它会返回所有200个项目,而arraySize只有20个。如果我记录json NSDictionary,我也只会得到20项。您的json格式有效吗?请在和报告中验证它。我已将URL输入jsonlint.org,结果显示它是有效的。。。虽然它也只返回20个值!我在中添加了代码,它不断地请求一个];要添加到最后一个花括号之前。我设法让它给我一个响应,尽管日志中仍然有一条错误消息,方法是添加这段代码,本质上是添加它要求的内容并删除错误定义。我已将更改后的代码添加到上述问题中。但即使这样做,仍然只有20个结果…哦,是的,我缺少了一个紧括号。只是按照你的建议更改了编码,仍然没有区别!不要把它完全改成我有的。只需创建responseData的NSString并记录它。找出字符串是否包含解析时有问题的字符。