返回的JSON数据正在从NSDictionary更改为NSArray

时间:2015-06-17 03:04:43

标签: objective-c json nsarray nsdictionary

我对使用JSON服务有点困难,我正在消费和迭代。当我使用服务时,由于记录的数量,我正在按照您的预期循环数据。

我将该循环数据保存到NSArray中,我稍后在UITableView中使用它。接下来,我只是简单地允许用户点击所选行(来自json数据结果)以显示更多细节。到目前为止很简单。

JSON服务中的每个元素都是NSString。到目前为止没什么棘手的。但是,服务放入NSObject后NSArray中的一个元素显示HEX代码,见下文。

altitude    NSString *  0x7ff8d4cd3d30  0x00007ff8d4cd3d30

当然,应用程序已经崩溃,因为当我使用该NSArray对象显示关键元素即海拔时,它无法弄清HEX是什么。现在奇怪的是NSArray中的每个其他元素看起来如下所示。

latitude    __NSCFString *  @"21.45852" 0x00007ff8d4ca54f0

我已经阅读了一些建议,说明这对于NSString和JSON数据来说是正常的。但不是真的如何解决它。

我发现JSON完成后的NSArray正在改变这一个元素。我也尝试将它从INT更改为NSString,但结果相同(我知道它首先是一个NSString,我只是尝试不同的想法。)

JSON调用和循环的摘要,添加到NSArray对象中。

    //Do something with returned array
               dispatch_async(dispatch_get_main_queue(), ^{
                   NSDictionary *pilotJson = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

                   //Loop through the JSON array
                   NSArray *currentPilotsArray = [pilotJson valueForKeyPath:@""];

                   //set up array and json call
                   pilotsArray = [[NSMutableArray alloc]init];

                   NSArray *keys=[pilotJson allKeys];
                   for (NSString *key in keys){
                       NSDictionary *elementDictionary=pilotJson[key];

                       NSString *altitude = elementDictionary[@"altitude"];

                       NSInteger n = [altitude intValue];
                       NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
                       formatter.numberStyle = NSNumberFormatterDecimalStyle;
                       NSString *string = [formatter stringFromNumber:@(n)];
                       NSString *nAltitude = [NSString stringWithFormat:@"%@ ft", string];

[pilotsArray addObject:[[LiveMap alloc]initWithaltitude:nAltitude ]];
.
.
.

因此,当我到达用户点击相关记录的代码的这一点时,我遇到了崩溃并且应用程序中止了。我假设这是来自上面的NSString vs __NSCFString

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //Pass the details the the detail view controller
    PilotsFlightDetailViewController *detail = [self.storyboard instantiateViewControllerWithIdentifier:@"FlightDetails"];

   NSLog(@"array: %@", pilotsArray);
    NSString *AltitudeString = [[self.pilotsArray valueForKey:@"altitude"]objectAtIndex:indexPath.row];    <-----WIGS OUT HERE

我发现这个超级奇怪,因为其他所有元素都能正常工作,但这个问题根本就存在问题。有什么建议吗?

更新: 根据请求,飞行员的NSLogArray。

[1] LiveMap *   0x7f8b0265e1b0  0x00007f8b0265e1b0
altitude    __NSCFString *  @"21 ft"    0x00007f8b02664860

也是来自Service Directly的jsonArray。

enter image description here

1 个答案:

答案 0 :(得分:1)

好。我搞定了。代码没有任何问题。然而,它认出另一个名称为“海拔高度”的NSObject,由于某种原因它混淆了。

我将NSObject中的名称更改为完全唯一的名称并更新了相关位置的实例。这样做了。获得的经验总是确保您已正确命名变量。