返回的 JSON 数据从 NSDictionary 变为 NSArray

Posted

技术标签:

【中文标题】返回的 JSON 数据从 NSDictionary 变为 NSArray【英文标题】:Returned JSON data is changing from NSDictionary to NSArray 【发布时间】:2015-06-17 03:04:42 【问题描述】:

我在使用和迭代 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

我发现这非常奇怪,因为其他所有元素都正常工作,但这个只是有问题。有什么建议吗?

更新: 根据请求的 PilotsArray 的 NSLog。

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

还有直接来自服务的 jsonArray。

【问题讨论】:

pilotJson 的 NSLog 开始,并将其添加到问题中,至少通过第一个 altitude @zaph,没问题,我会将 NSLog 添加到问题中。 【参考方案1】:

好的。我让它工作了。代码没有任何问题。然而,它识别出另一个具有相同名称“高度”的 NSObject,并且由于某种原因它被混淆了。

我将 NSObject 中的名称更改为完全独特的名称,并更新了相关位置的实例。这做到了。经验教训始终确保您正确命名了变量。

【讨论】:

以上是关于返回的 JSON 数据从 NSDictionary 变为 NSArray的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 数据从 NSData 转换为 NSDictionary

如何从 NSDictionary 将 json 显示到 uitextview

在 NSDictionary 上使用地图

NSDictionary objectForKey 返回值

读取 JSON 数据的 NSDictionary

将此数据从 JSON 解析为 NSDictionary [重复]