Objective c JSON请求错误
我第一次在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
#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"];