Objective c JSON请求错误

Objective c JSON请求错误,objective-c,json,Objective C,Json,我第一次在Objective-C中试验JSON 以下是我的终端应用程序的代码: #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://itunes.ap

我第一次在Objective-C中试验JSON

以下是我的终端应用程序的代码:

#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
    @autoreleasepool
    {
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://itunes.apple.com/search?term=harry&country=us"]];
        NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
        NSError *jsonParsingError = nil;
        NSArray *publicTimeline = [NSJSONSerialization JSONObjectWithData:response options:0 error:&jsonParsingError];
        NSDictionary *list;
        for(int i=0; i<[publicTimeline count];i++)
        {
            list = [publicTimeline objectAtIndex:i];
            NSLog(@"Statuses: %@", [list objectForKey:@"trackName"]);
        }
    }
    return 0;
}

怎么了?我完全遵循了教程,但我是唯一一个出错的人。

我运行了您的代码。我的结果和你的不一致。我没有崩溃,但我确实从最后的
NSLog
调用中收到了
(null)

是的,您应该检查
+[NSJSONSerialization JSONObjectWithData:options:error]
的结果。正如@HotLicks非常正确地向您指出的那样,如果您得到的结果为零,那么检查error对象可以揭示出错误所在的重要线索

但在这种情况下,这是学术性的,因为结果(同样,在我的情况下)不是
nil
。然而,真正的问题是,您似乎不了解数据的模式
jsonObject
是一个字典,但它只有两个键,
results
resultCount
,这就是为什么您从
[jsonObject objectForKey:@“trackName”]
得到零的原因
trackName
不是其中一个键

然而,你得到的这两把钥匙应该告诉你很多。它告诉了我足够多的东西来尝试这个:

NSArray *results = [jsonObject objectForKey:@"results"];
NSDictionary *dictionary = [results objectAtIndex:0];
id latestLoans = [dictionary objectForKey:@"trackName"];
结果是:

Harry Potter and the Deathly Hallows - Part 1
换句话说,我只是获取了数组中
结果
的第一个字典,并要求它提供
trackName
的对象

由于您最初要求的是数组,我猜您需要该特定键的所有值,因此如果您使用以下方法:

NSArray *latestLoans = [jsonObject valueForKeyPath:@"results.trackName"];
它在
results
键下的字典中提供了一个50个值的列表,这些值对应于
trackName

编辑:


您真正需要做的另一件事是,在调用任何其他内容之前先检查
nil
,以防止调用
-[NSData initWithContentsOfURL:
返回
nil
。单凭这一点并不能解决你无法得到回应的问题,但它可以防止你崩溃。如果你确实收到了
nil
,一定要检查错误对象的
code
属性,你会发现问题所在。

一旦你找到了问题所在,如果没有“贷款”的密钥,你就很难从中获得任何东西;显然,您要传递的数据是
nil
,您需要首先修复它。不,您得到的错误是在NSError对象中,您没有检查。我是iOS开发的新手。如果不太麻烦的话,你能不能建议修复代码。正如@HotLicks所暗示的,修复代码的关键是调查错误对象。在你检查错误对象之前,我肯定不会建议修复。这是有原因的。小细节:新手在学习JSON时,不应该像
[[jsonObject objectForKey:@“results”]objectAtIndex:0]objectForKey:@“trackName”]
(甚至是相同序列的新符号)那样进行“菊花链”访问。相反,将每个步骤作为单独的一行进行,将结果分配给临时值。这更易于调试和维护。@HotLicks查看我的编辑。@trudyscosing-我仍然收到相同的错误:(@SanjeetSuhag您在哪里?您可能在印度吗?如果是,请尝试用“in”代替“us”来表示国家代码。您传递的URL参数可能与您所在的地区不兼容。您的互联网连接如何?是否需要等待很长时间(大约30秒?)在您崩溃之前?可能服务器拒绝了您的连接。请查看我对原始答案的编辑。@我已经更新了代码。请查看。
NSArray *latestLoans = [jsonObject valueForKeyPath:@"results.trackName"];