我正在尝试从更高的范围访问Objective-C中的JSON。但它一直在崩溃,我不明白为什么。
以下代码有效:
- (void)fetchedData:(NSData *)responseData {
NSError* error;
NSDictionary* json = [NSJSONSerialization
JSONOnkectWithData: responseData
options:kNilOptions
error:&error];
NSArray* nameAndPlace = [[json objectForKey:@"objects"] objectForKey:@"havens"];
//NSArray* productArray = [[json objectForKey:@"objects"] objectForKey:@"products"];
NSLog(@"FROM ---> %@", nameAndPlace);
for (NSDictionary *mapPointLoop in nameAndPlace) {
NSString * name = [mapPointLoop objectForKey:@"name"];
NSString * longitudeGet = [mapPointLoop objectForKey:@"longitude"];
NSString * latitudeGet = [mapPointLoop objectForKey:@"latitude"];
myAnnotation *annotation1 = [[myAnnotation alloc] init];
CLLocationCoordinate2D coordinate1;
coordinate1.longitude = longitude;
coordinate1.latitude = latitude;
annotation1.coordinate = coordinate1;
annotation1.title = name;
[mainMap addAnnotation:annotation1];
//NSLog(@"FROM ---> %@", mapPointLoop);
}
}
但是当我使用它时它会崩溃:
- (void)fetchedData:(NSData *)responseData {
NSError* error;
NSDictionary* json = [NSJSONSerialization
JSONObjectWithData:responseData
options:kNilOptions
error:&error];
NSArray* nameAndPlace = [json objectForKey:@"objects"];
//NSArray* productArray = [[json objectForKey:@"objects"] objectForKey:@"products"];
NSLog(@"FROM -> %@", nameAndP1ace);
for (NSDictionary *mapPointLoop in nameAndPlace) {
NSString * name = [[mapPointLoop objectForKey:@"havens"] objectForKey:@"name"];
NSNumber * longitudeGet = [mapPointLoop objectForKey:@"longitude"];
NSNumber * latitudeGet = [mapPointLoop objectForKey:@"latitude"];
float latitude = [latitudeGet floatvalue];
float longitude = [longitudeGet floatvalue];
myAnnotation *annotation1 = [[myAnnotation alloc] init];
CLLocationCoordinate2D coordinate1;
coordinate1.longitude = longitude;
coordinate1.latitude = latitude;
annotation1.coordinate = coordinate1
annotation1.title = name;
[mainMap addAnnotation:annotation1];
//NSLog(@"FROM -> %@", mapPointLoop):
}
}
它因错误而崩溃......
2014-05-20 17:49:57.709 labelAPortTest [5556:60b] * 终止应用 由于未捕获的异常'NSInvalidArgumentException',原因: ' - [__ NSCFString objectForKey:]:发送到实例的无法识别的选择器 0x1172426b0'
答案 0 :(得分:3)
崩溃是因为当你取名字时:
NSString *name = [[mapPointLoop objectForKey:@"havnes"] objectForKey:@"name"];
这样:
[mapPointLoop objectForKey:@"havens"]
是NSArray
,而不是NSDictionary
,密钥为name
。
事实上,在您的第一个代码中,您可以使用objectForKey:@"objects"] objectForKey:@"havens]"
所以你有这种情况:
NSDictionary
〜> 对象 〜> NSDictionary
〜> 避风港 〜> NSArray
(NSDictionary
)
然后你会经历一个for循环,在NSDictionary
中获得NSArray
的1比1。
第二种情况(崩溃):
NSDictionary
〜> 对象 〜> NSDictionary
但是你正在NSArray
再次使用for循环... NSDictionary
。
答案 1 :(得分:0)
但它一直在崩溃,我不明白为什么。
原因就在这里:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x1172426b0'
你有一个未被捕获的例外。此外,您有一些关于该异常的信息,即您将objectForKey:
消息发送给未实现它的对象。
您应该做的第一件事是为所有例外设置断点:
这会导致调试器在抛出异常后立即停止,而不是等到应用程序退出,这将为您提供更多的上下文。您应该能够看到哪个对象正在获取未知消息。如果这不能完全解决问题,请在异常发生之前将断点设置为一行或两行,并一次一行地执行代码,直到找到问题为止。