我在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;
}
这是我得到的错误:
2013-09-11 20:58:55.524 Tweets[7291:303] -[__NSCFDictionary objectAtIndex:]: unrecognized selector sent to instance 0x100391d60
2013-09-11 20:58:55.526 Tweets[7291:303] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary objectAtIndex:]: unrecognized selector sent to instance 0x100391d60'
*** First throw call stack:
(
0 CoreFoundation 0x00007fff91688b06 __exceptionPreprocess + 198
1 libobjc.A.dylib 0x00007fff8bf8a3f0 objc_exception_throw + 43
2 CoreFoundation 0x00007fff9171f40a -[NSObject(NSObject) doesNotRecognizeSelector:] + 186
3 CoreFoundation 0x00007fff9167702e ___forwarding___ + 414
4 CoreFoundation 0x00007fff91676e18 _CF_forwarding_prep_0 + 232
5 Tweets 0x0000000100000d1a main + 378
6 libdyld.dylib 0x00007fff908e67e1 start + 0
)
libc++abi.dylib: terminate called throwing an exception
怎么了?我完全按照教程,但我是唯一一个得到错误的人。
答案 0 :(得分:1)
我运行了你的代码。我的结果与你的不一致。我没有崩溃,但我确实从最后的(null)
电话中收到NSLog
。
是的,您应该检查+[NSJSONSerialization JSONObjectWithData:options:error]
的结果。正如@HotLicks非常正确地向你指出的那样,如果得到的结果是nil,检查错误对象可以揭示出错的重要线索。
但是在这种情况下,它是学术性的,因为结果(在我的情况下再次)不是nil
。但是,真正的问题是您似乎并不了解数据的架构。 jsonObject
是一个字典,但它只有两个键results
和resultCount
,这就是你从[jsonObject objectForKey:@"trackName"]
获得nil的原因; trackName
不是关键之一。
然而,你得到的那两把钥匙应该告诉你很多。它告诉我足够尝试这个:
NSArray *results = [jsonObject objectForKey:@"results"];
NSDictionary *dictionary = [results objectAtIndex:0];
id latestLoans = [dictionary objectForKey:@"trackName"];
得到了一个结果:
Harry Potter and the Deathly Hallows - Part 1
换句话说,我只是在results
的数组中得到了第一个字典,并询问了它为trackName
所拥有的对象。
因为你最初要求一个数组,我猜你想要那个特定键的所有值,所以如果你使用它:
NSArray *latestLoans = [jsonObject valueForKeyPath:@"results.trackName"];
它提供了与trackName
键下词典中results
键对应的50个值的列表。
编辑:
您真正需要做的另一件事是保护自己免受nil
通过在调用其他任何内容之前检查-[NSData initWithContentsOfURL:]
来回复nil
的可能性。仅此一项并不能解决您无法获得响应的问题,但它可以防止您崩溃。如果您收到domain
,请务必查看您收到的错误对象的code
和{{1}}属性,以了解出现了什么问题。