dvd*_*sgn 9 replace nsdictionary plist ios nsnull
这个问题类似于这个问题,但这种方法只适用于字典的根目录下.
我想NSNull用空字符串替换任何出现的值,以便我可以将完整的字典保存到plist文件(如果我用NSNull添加它,文件将不会写入).
但是,我的词典里面嵌套了词典.像这样:
"dictKeyName" = {
innerStrKeyName = "This is a string in a dictionary";
innerNullKeyName = "<null>";
innerDictKeyName = {
"innerDictStrKeyName" = "This is a string in a Dictionary in another Dictionary";
"innerDictNullKeyName" = "<null>";
};
};
Run Code Online (Sandbox Code Playgroud)
如果我使用:
@interface NSDictionary (JRAdditions)
- (NSDictionary *) dictionaryByReplacingNullsWithStrings;
@end
@implementation NSDictionary (JRAdditions)
- (NSDictionary *) dictionaryByReplacingNullsWithStrings {
const NSMutableDictionary *replaced = [NSMutableDictionary dictionaryWithDictionary:self];
const id nul = [NSNull null];
const NSString *blank = @"";
for(NSString *key in replaced) {
const id object = [self objectForKey:key];
if(object == nul) {
[replaced setObject:blank forKey:key];
}
}
return [NSDictionary dictionaryWithDictionary:replaced];
}
@end
Run Code Online (Sandbox Code Playgroud)
我得到这样的东西:
"dictKeyName" = {
innerStrKeyName = "This is a string in a dictionary";
innerNullKeyName = ""; <-- this value has changed
innerDictKeyName = {
"innerDictStrKeyName" = "This is a string in a Dictionary in another Dictionary";
"innerDictNullKeyName" = "<null>"; <-- this value hasn't changed
};
};
Run Code Online (Sandbox Code Playgroud)
有没有办法找到NSNull所有字典中的每个值,包括嵌套字典......?
编辑: 将数据从一个JSON料绘制,所以我接收到的数据是动态的(我不希望有更新的应用在每次改变饲料).
fgu*_*aar 17
对该方法的一个小修改可以使其递归:
@interface NSDictionary (JRAdditions)
- (NSDictionary *) dictionaryByReplacingNullsWithStrings;
@end
@implementation NSDictionary (JRAdditions)
- (NSDictionary *) dictionaryByReplacingNullsWithStrings {
const NSMutableDictionary *replaced = [NSMutableDictionary dictionaryWithDictionary: self];
const id nul = [NSNull null];
const NSString *blank = @"";
for (NSString *key in self) {
const id object = [self objectForKey: key];
if (object == nul) {
[replaced setObject: blank forKey: key];
}
else if ([object isKindOfClass: [NSDictionary class]]) {
[replaced setObject: [(NSDictionary *) object dictionaryByReplacingNullsWithStrings] forKey: key];
}
}
return [NSDictionary dictionaryWithDictionary: replaced];
}
Run Code Online (Sandbox Code Playgroud)
请注意,快速枚举现在开启self而不是replaced
使用上面的代码,这个例子:
NSMutableDictionary *dic1 = [NSMutableDictionary dictionary];
[dic1 setObject: @"string 1" forKey: @"key1.1"];
[dic1 setObject: [NSNull null] forKey: @"key1.2"];
NSMutableDictionary *dic2 = [NSMutableDictionary dictionary];
[dic2 setObject: @"string 2" forKey: @"key2.1"];
[dic2 setObject: [NSNull null] forKey: @"key2.2"];
[dic1 setObject: dic2 forKey: @"key1.3"];
NSLog(@"%@", dic1);
NSLog(@"%@", [dic1 dictionaryByReplacingNullsWithStrings]);
Run Code Online (Sandbox Code Playgroud)
呈现此结果:
2012-09-01 08:30:16.210 Test[57731:c07] {
"key1.1" = "string 1";
"key1.2" = "<null>";
"key1.3" = {
"key2.1" = "string 2";
"key2.2" = "<null>";
};
}
2012-09-01 08:30:16.212 Test[57731:c07] {
"key1.1" = "string 1";
"key1.2" = "";
"key1.3" = {
"key2.1" = "string 2";
"key2.2" = "";
};
Run Code Online (Sandbox Code Playgroud)
Jee*_*amy 11
它适用于我,我使用嵌套循环来替换整个字典中包含NSArray的所有NULL和nil.
- (NSDictionary *) dictionaryByReplacingNullsWithNil:(NSDictionary*)sourceDictionary {
NSMutableDictionary *replaced = [NSMutableDictionary dictionaryWithDictionary:sourceDictionary];
const id nul = [NSNull null];
for(NSString *key in replaced) {
const id object = [sourceDictionary objectForKey:key];
if(object == nul) {
[replaced setValue:nil forKey:key];
}
}
return [NSDictionary dictionaryWithDictionary:replaced];
}
-(NSDictionary *) nestedDictionaryByReplacingNullsWithNil:(NSDictionary*)sourceDictionary
{
NSMutableDictionary *replaced = [NSMutableDictionary dictionaryWithDictionary:sourceDictionary];
const id nul = [NSNull null];
const NSString *blank = @"";
[sourceDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) {
object = [sourceDictionary objectForKey:key];
if([object isKindOfClass:[NSDictionary class]])
{
NSDictionary *innerDict = object;
[replaced setObject:[self nestedDictionaryByReplacingNullsWithNil:innerDict] forKey:key];
}
else if([object isKindOfClass:[NSArray class]]){
NSMutableArray *nullFreeRecords = [NSMutableArray array];
for (id record in object) {
if([record isKindOfClass:[NSDictionary class]])
{
NSDictionary *nullFreeRecord = [self nestedDictionaryByReplacingNullsWithNil:record];
[nullFreeRecords addObject:nullFreeRecord];
}
}
[replaced setObject:nullFreeRecords forKey:key];
}
else
{
if(object == nul) {
[replaced setObject:blank forKey:key];
}
}
}];
return [NSDictionary dictionaryWithDictionary:replaced];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6441 次 |
| 最近记录: |