返回的 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