我们有以下方法尝试访问给定索引处的数组对象。数组是resultArr
。当我们进行resultArr
计数时,它给出了13的结果。所以我们知道数组不是null,但是当我们尝试objectAtIndex
时,它会因错误而崩溃。
功能:
- (void)fetchedData:(NSData *)responseData {
//parse out the json data
NSError* error;
NSDictionary* json = [NSJSONSerialization
JSONObjectWithData:responseData //1
options:kNilOptions
error:&error];
NSArray *keys = [json allKeys];
NSLog(@"keys: %@",keys);
NSArray* htmlAttributions = [json objectForKey:@"html_attributions"]; //2
NSArray* resultArr = (NSArray *)[json objectForKey:@"result"]; //2
NSArray* statusArr = [json objectForKey:@"status"]; //2
NSLog(@"htmlAttributions: %@",htmlAttributions);
NSLog(@"result: %@", resultArr); //3
NSLog(@"status: %@", statusArr); //3
NSLog(@"resultCount: %d",[resultArr count]);
[resultArr objectAtIndex:0];
}
错误:
2012-04-01 22:31:52.757 jsonParsing[5020:f803] resultCount: 13 2012-04-01 22:31:52.759 jsonParsing[5020:f803] -[__NSCFDictionary objectAtIndex:]: unrecognized selector sent to instance 0x6d2f900 2012-04-01 22:31:52.760 jsonParsing[5020:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary objectAtIndex:]: unrecognized selector sent to instance 0x6d2f900'
*** First throw call stack:
谢谢。
答案 0 :(得分:2)
错误消息非常具有描述性。您的代码期望为NSArray
的其中一个对象实际上是NSDictionary
。您无法使用NSDictionary
方法访问NSArray
内的字段(从NSDictionary*
转换为NSArray*
不会将NSDictionary
转换为NSArray
})。
这意味着在JSON内部,您的一个元素被序列化为对象/关联数组而不是普通数组。您可以通过将JSON数据视为文本,并找到使用{
和}
而不是[
和]
的项来轻松确定哪一项。
答案 1 :(得分:0)
你在说
NSArray* resultArr = (NSArray *)[json objectForKey:@"result"]; //2
但是这不会使这个对象([json objectForKey:@"result"]
)成为NSArray。它是一个NSDictionary,并向它发送一条消息,NSDictionary没有响应(objectAtIndex:
)导致崩溃。
您可以发送count
消息而不会崩溃,因为NSDictionary确实会响应count
消息。但是你认为这是一个数组仍然是错误的。
答案 2 :(得分:0)
您尝试使用此行时无法将NSDictionary *强制转换为NSArray *:NSArray* resultArr = (NSArray *)[json objectForKey:@"result"];
,然后调用-objectAtIndex。