如何从NSDictionary中删除<null>?</null>

时间:2012-11-17 09:03:20

标签: objective-c nsdictionary nsnull

我正在尝试使用不允许空值的NSArray NSDictionaries的writeToFile方法。我想通过循环找到它们并用空NSString替换,但我无法让它工作。这就是我正在尝试的。

编辑:NSArrays和NSDictionaries由NSJSONSerialization创建。

for (NSMutableDictionary *mainDict in mainArray)
{
    for(NSMutableDictionary *subDict in mainDict)
    {
        for(NSString *key in subDict)
        {                
            id value = [subDict objectForKey:key];

            if (value == [NSNull null])
            {
                [subDict setObject:@"" forKey:key];
            }
        }
    }
}

但这引发了一个例外。 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object'

但是你可以看到所有的NSDictionaries都是可变的。

怎么了? 有更好的方法吗?

编辑:将新版本移至单独的答案。

2 个答案:

答案 0 :(得分:5)

你怎么知道这些词典是可变的?看起来他们不是。在枚举期间将它们键入NSMutableDictionary并不会使它们变得可变。您可以遍历字典并将密钥移动到一个新的,可变的密钥中,过滤空值。

此外,如果您的词典来自NSJSONSerialization,请查看NSJSONReadingOptions,可以选择使用可变容器作为反序列化结构。这并不总是一个好的解决方案,但值得一试。

对于在枚举字典时改变字典:您无法更改密钥,因为这很容易丢失枚举代码。但我不明白为什么你不能改变关键值,这就是你所追求的。此代码有效:

NSMutableDictionary *dict = [@{@"foo" : @"bar"} mutableCopy];
for (NSString *key in dict) {
    dict[key] = @"baz";
}

答案 1 :(得分:0)

或者重建整棵树。

NSMutableArray *newMainArray = [[NSMutableArray alloc] init];
for (NSArray *subArray in self.mainArray)
{
    NSMutableArray *newSubArray = [[NSMutableArray alloc] init];
    for(NSDictionary *dict in subArray)
    {
        NSMutableDictionary *newDict = [[NSMutableDictionary alloc] init];
        for(NSString *key in dict)
        {              
            id value = [dict objectForKey:key];
            if (value == [NSNull null])
            {
                [newDict setObject:@"" forKey:key];
            } else {
                [newDict setObject:value forKey:key];
            }
        }
        [newSubArray addObject:newdict];
        [newDict release];
    }
    [newMainArray addObject:newSubArray];
    [newSubArray release];
}
[self.mainArray release];     <----  ????
self.mainArray = newMainArray;