无法将返回的objectForKey作为NSString

时间:2011-06-23 06:15:23

标签: objective-c json nsdata

编辑:

对不起,我发布这个问题已经很晚了,让我看看能不能说清楚。 目前我的应用程序没有编译错误和运行,但我期待它做的是放置 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
}

2 个答案:

答案 0 :(得分:4)

dict中对象的格式是什么? 如果它只是一个字符串,则不需要在

中使用“description”
NSString* lng_coord = [[dict objectForKey:key] description];

如果您想确保拥有NSString,请使用

NSString* lng_coord = (NSString*)[dict objectForKey:key];

答案 1 :(得分:0)

我遇到了同样的问题。

正在使用在json中返回字符串的第三方服务。我自己的服务返回相同的值(.Net WCF)。字典中键的比较失败。

我将返回类型更改为字符串以匹配第三方服务类型,并且工作正常。