从 NSMutableDictionary 构建 NSMutableArray 导致 NSException

Posted

技术标签:

【中文标题】从 NSMutableDictionary 构建 NSMutableArray 导致 NSException【英文标题】:Building NSMutableArray from NSMutableDictionary resulting in NSException 【发布时间】:2017-05-20 02:05:14 【问题描述】:

我是 ios 开发的新手。我试图将 NSMutableArray 的结果放入 NSMutableString 中,但这会导致 NSException。 这是我的代码:

NSMutableArray *oldtableData = .......this is where I recieve card data;
NSError *error;
NSMutableData *tableDataUpdated = [[NSJSONSerialization dataWithJSONObject:oldtableData
                                                                       options:0
                                                                         error:&error] copy];
NSMutableDictionary *cardDictionary = [NSJSONSerialization JSONObjectWithData:tableDataUpdated options:0 error:NULL];

为了将 cardDictionary 转换为 NSMutableArray,我正在使用这段代码(这给了我一个 NSException)

NSMutableArray *type = [NSMutableArray array];
NSMutableArray *last4Digits = [NSMutableArray array];
[cardDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) 
    [type addObject:[obj valueForKeyPath:@"type"]];
    [last4Digits addObject:[obj valueForKeyPath:@"last4Digits"]];
];

但是如果我排除上面的代码并用这段代码尝试 NSLog

NSLog(@"JSON: %@",cardDictionary);

控制台会给出正确的 json 结果;像这样:

JSON: (
    
    cardPciId = "###########";
    fingerPrint = ###########;
    last4Digits = 4321;
    type = Mastercard;
,
    
    cardPciId = "###########";
    fingerPrint = ###########;
    last4Digits = 1234;
    type = Visa;

)

我正在尝试将其转换为两个数组,一个包含所有“类型”,另一个包含所有“last4Digits”。但这就是我得到的

Uncaught exception: -[__NSCFArray enumerateKeysAndObjectsUsingBlock:]:
unrecognized selector sent to instance 0x7ff7060badf0

我试图通过 *** 悬停以找到解决方案,但它们似乎都不起作用。 :(

【问题讨论】:

【参考方案1】:

看起来cardDictionary 实际上是一个包含字典的NSArray 实例。因此,您应该遍历数组,并使用objectForKey 而不是valueForKeyPath 从每个字典中获取typelast4Digits

NSArray *cardDictionaries = [NSJSONSerialization JSONObjectWithData:tableDataUpdated options:0 error:NULL];

NSMutableArray *type = [NSMutableArray array];
NSMutableArray *last4Digits = [NSMutableArray array];

[cardDictionaries enumerateObjectsUsingBlock:^(NSDictionary *cardDictionary, NSUInteger idx, BOOL *stop) 
  [type addObject:[cardDictionary objectForKey:@"type"]];
  [last4Digits addObject:[cardDictionary objectForKey:@"last4Digits"]];
];

【讨论】:

【参考方案2】:

这里发生了很多事情,但我想指出一件事。

表数据正在序列化为 JSON。

NSMutableData *tableDataUpdated = [[NSJSONSerialization dataWithJSONObject:oldtableData
                                                                       options:0
                                                                         error:&error] copy];

接下来,对刚刚序列化的数据进行反序列化。它将始终是同一个数组。

NSMutableDictionary *cardDictionary = [NSJSONSerialization JSONObjectWithData:tableDataUpdated options:0 error:NULL];

您将始终获得相同的数据。您根本不需要执行 JSON 步骤。

【讨论】:

以上是关于从 NSMutableDictionary 构建 NSMutableArray 导致 NSException的主要内容,如果未能解决你的问题,请参考以下文章

JSON 的 NSMutableDictionary

AFNetworking - NSMutableDictionary 参数

从 plist 加载 NSMutableDictionary

从 NSMutableDictionary 中删除对象

通过 UITableView 从 NSMutableDictionary 添加/删除项目

从ios中的nsmutableDictionary中删除一个键