编辑:
对不起,我发布这个问题已经很晚了,让我看看能不能说清楚。 目前我的应用程序没有编译错误和运行,但我期待它做的是放置 MKMapview上的引脚。当我运行它时,地图上没有显示任何引脚。当我调查控制台时,没有显示任何错误或指示。我已经缩小了这个bug 到这两行:
NSString* lng_coord = [[dict objectForKey:key] description];
[CelebsAnnotation setLongitude:[lng_coord doubleValue]];
问题是我似乎无法让lng_coord doubleValue给我一个double值,因为如果它那么引脚会出现。我知道这个,因为如果我这样做:
[CelebsAnnotation setLongitude:54.39281]; // for example
然后针脚出现在地图上。所以如果lng_coord没有给我一个doubleValue,那就是 我相信它一定不是NSString,这意味着objectForKey没有返回NSString(虽然我完全有理由相信它是因为我使用过):
// Use when fetching text data
NSString *response = [request responseString];
然后使用SBJSON解析该响应字符串。我知道我正在从JSON响应中成功解析lng / lat值,因为我可以这样做:
NSLog(@"%@", lng_coord);
并在控制台中打印出正确的数字值。我已经尝试从objectForKey转换返回值,如下所示:
NSString* lng_coord = (NSString*)[dict objectForKey:key];
没有成功。然后,我在SO周围搜索了一种方法,将objectForKey的返回值转换为NSString,“description”似乎是答案,尽管 也没有为我工作。
总而言之,我需要一个用于lng_coord的NSString值,以便我可以得到该字符串的doubleValue!谢谢大家的时间。只不过喜欢Stack Overflow。
这是我的PHP脚本中的JSON编码响应,我的应用正在解析它:
[
{"lng":"49.2796758","lat":"-123.1365125"},
{"lng":"49.2695877","lat":"-123.0443507"},
{"lng":"50.4547222","lat":"-104.6066667"},
{"lng":"49.2696243","lat":"-123.0696036"},
{"lng":"49.2688942","lat":"-123.1388003"},
{"lng":"49.2796758","lat":"-123.1365125"}
]
这是包含我上面描述的错误的函数:
- (void)requestFinished:(ASIHTTPRequest *)request
{
// Use when fetching text data
NSString *response = [request responseString];
SBJsonParser *parser = [[SBJsonParser alloc] init];
NSArray *pins = [parser objectWithString:response error:nil]; // an array of dictionaries that contain coords
// loop through the pins array of dictionaries (lng, lat)
for (int i = 0; i < [pins count]; i++)
{
NSDictionary *dict = [pins objectAtIndex:i];
for(NSString *key in dict) {
if ([key isEqualToString: @"lng"]) { // access of the longitude coord
NSString* lng_coord = [[dict objectForKey:key] description];
[CelebsAnnotation setLongitude:[lng_coord doubleValue]];
}
if ([key isEqualToString:@"lat"]) { // access of the latitude coord
NSString* lat_coord = [[dict objectForKey:key] description];
[CelebsAnnotation setLatitude:[lat_coord doubleValue]];
}
}
// now that you've set the lng/lat, insert the annotation at index i
CelebsAnnotation *newAnnotation = [[CelebsAnnotation alloc] init]; // template object for all pins
[self.mapAnnotations insertObject:newAnnotation atIndex:i];
[newAnnotation release];
[self.mapView removeAnnotations:self.mapView.annotations];
[self.mapView addAnnotation:[self.mapAnnotations objectAtIndex:i]]; // add annotation
}
答案 0 :(得分:4)
dict中对象的格式是什么? 如果它只是一个字符串,则不需要在
中使用“description”NSString* lng_coord = [[dict objectForKey:key] description];
如果您想确保拥有NSString,请使用
NSString* lng_coord = (NSString*)[dict objectForKey:key];
答案 1 :(得分:0)
我遇到了同样的问题。
正在使用在json中返回字符串的第三方服务。我自己的服务返回相同的值(.Net WCF)。字典中键的比较失败。
我将返回类型更改为字符串以匹配第三方服务类型,并且工作正常。