从 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
从每个字典中获取type
和last4Digits
:
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的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking - NSMutableDictionary 参数
从 plist 加载 NSMutableDictionary