如何从NSDictionary中删除空值
我有一个JSON Feed:
{ "count1" = 2; "count2" = 2; idval = 40; level = "<null>"; "logo_url" = "/assets/logos/default_logo_medium.png"; name = "Golf Club"; "role_in_club" = Admin; }
问题是"<null>"
,我不知道如何将其保存到NSUserDefaults之前从NSDictionary中删除。
请帮我解决这个问题。 谢谢!
遍历字典并查找任何空条目并将其删除。
NSMutableDictionary *prunedDictionary = [NSMutableDictionary dictionary]; for (NSString * key in [yourDictionary allKeys]) { if (![[yourDictionary objectForKey:key] isKindOfClass:[NSNull class]]) [prunedDictionary setObject:[yourDictionary objectForKey:key] forKey:key]; }
之后, prunedDictionary
应在原始字典中包含所有非null项目。
另一个变体,没有(显式)循环:
NSMutableDictionary *dict = [yourDictionary mutableCopy]; NSArray *keysForNullValues = [dict allKeysForObject:[NSNull null]]; [dict removeObjectsForKeys:keysForNullValues];
使用这个从字典中删除null
- (NSMutableDictionary *)recursive:(NSMutableDictionary *)dictionary { for (NSString *key in [dictionary allKeys]) { id nullString = [dictionary objectForKey:key]; if ([nullString isKindOfClass:[NSDictionary class]]) { [self recursive:(NSMutableDictionary*)nullString]; } else { if ((NSString*)nullString == (id)[NSNull null]) [dictionary setValue:@"" forKey:key]; } } return dictionary; }
这是我的基于类别的recursion解决scheme,包含字典和数组的字典,其值也可以是字典和数组:
文件NSDictionary + Dario.m :
#import "NSArray+Dario.h" @implementation NSDictionary (Dario) - (NSDictionary *) dictionaryByReplacingNullsWithEmptyStrings { const NSMutableDictionary *replaced = [NSMutableDictionary new]; 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:[object dictionaryByReplacingNullsWithEmptyStrings] forKey:key]; } else if ([object isKindOfClass:[NSArray class]]) { [replaced setObject:[object arrayByReplacingNullsWithEmptyStrings] forKey:key]; } else { [replaced setObject:object forKey:key]; } } return [NSDictionary dictionaryWithDictionary:(NSDictionary*)replaced]; } @end
文件NSArray + Dario.m :
#import "NSDictionary+Dario.h" @implementation NSArray (Dario) - (NSArray *) arrayByReplacingNullsWithEmptyStrings { const NSMutableArray *replaced = [NSMutableArray new]; const id nul = [NSNull null]; const NSString *blank = @""; for (int i=0; i<[self count]; i++) { const id object = [self objectAtIndex:i]; if ([object isKindOfClass:[NSDictionary class]]) { [replaced setObject:[object dictionaryByReplacingNullsWithEmptyStrings] atIndexedSubscript:i]; } else if ([object isKindOfClass:[NSArray class]]) { [replaced setObject:[object arrayByReplacingNullsWithEmptyStrings] atIndexedSubscript:i]; } else if (object == nul){ [replaced setObject:blank atIndexedSubscript:i]; } else { [replaced setObject:object atIndexedSubscript:i]; } } return [NSArray arrayWithArray:(NSArray*)replaced]; }
要将其删除,请将其转换为可变字典并删除“level”级别的对象;
NSDictionary* dict = ....; // this is the dictionary to modify NSMutableDictionary* mutableDict = [dict mutableCopy]; [mutableDict removeObjectForKey:@"level"]; dict = [mutableDict copy];
如果你不使用ARC,你需要添加一些调用“释放”。
更新:
如果您不知道"<null>"
对象的密钥名称,则必须迭代:
NSDictionary* dict = ....; // this is the dictionary to modify NSMutableDictionary* mutableDict = [dict mutableCopy]; for (id key in dict) { id value = [dict objectForKey: key]; if ([@"<null>" isEqual: value]) { [mutableDict removeObjectForKey:key]; } } dict = [mutableDict copy];
要find"<null>"
值,我使用了一个string比较,因为"<null>"
是你的示例中的一个string。 但是我不确定这是否真的如此。
我相信这是最节省资源的方式
NSDictionary上的类别实现
- (NSDictionary *)dictionaryByRemovingNullValues { NSMutableDictionary * d; for (NSString * key in self) { if (self[key] == [NSNull null]) { if (d == nil) { d = [NSMutableDictionary dictionaryWithDictionary:self]; } [d removeObjectForKey:key]; } } if (d == nil) { return self; } return d; }
我为NSJSOn序列化类创build了一个类。
创build一个类别并导入类以使用其方法…
// Mutable containers are required to remove nulls. if (replacingNulls) { // Force add NSJSONReadingMutableContainers since the null removal depends on it. opt = opt || NSJSONReadingMutableContainers; } id JSONObject = [self JSONObjectWithData:data options:opt error:error]; if ((error && *error) || !replacingNulls) { return JSONObject; } [JSONObject recursivelyReplaceNullsIgnoringArrays:ignoreArrays withString:replaceString]; return JSONObject;
我试过你的问题的解决scheme,我明白了
NSDictionary *dict = [[NSDictionary alloc]initWithObjectsAndKeys:@"2",@"count1",@"2",@"count2",@"40",@"idval",@"<null>",@"level",@"/assets/logos/default_logo_medium.png",@"logo_url",@"Golf Club",@"name",@"role_in_club",@"Admin", nil]; NSMutableDictionary *mutableDict = [dict mutableCopy]; for (NSString *key in [dict allKeys]) { if ([dict[key] isEqual:[NSNull null]]) { mutableDict[key] = @""; } if([dict[key] isEqualToString:@"<null>"]) { mutableDict[key] = @""; } } dict = [mutableDict copy]; NSLog(@"The dict is - %@",dict);
最后的答案是
The dict is - { Admin = "role_in_club"; count1 = 2; count2 = 2; idval = 40; level = ""; "logo_url" = "/assets/logos/default_logo_medium.png"; name = "Golf Club"; }
我正在这样做。
NSMutableDictionary *prunedDict = [NSMutableDictionary dictionary]; [self enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) { if (![obj isKindOfClass:[NSNull class]]) { prunedDict[key] = obj; } }];
当结果是在数组或字典中时,下面的代码是可以的,你可以通过编辑代码将结果更改为nil或空string
该函数是recursion的,所以可以在字典中parsing数组。
-(id)changeNull:(id)sender{ id newObj; if ([sender isKindOfClass:[NSArray class]]){ NSMutableArray *newArray = [[NSMutableArray alloc] init]; for (id item in sender){ [newArray addObject:[self changeNull:item]]; } newObj = newArray; } else if ([sender isKindOfClass:[NSDictionary class]]){ NSMutableDictionary *newDict = [[NSMutableDictionary alloc] init]; for (NSString *key in sender){ NSDictionary *oldDict = (NSDictionary*)sender; id item = oldDict[key]; if (![item isKindOfClass:[NSDictionary class]] && ![item isKindOfClass:[NSArray class]]){ if ([item isEqual:[NSNull null]]){ item = @""; } [newDict setValue:item forKey:key]; } else{ [newDict setValue:[self changeNull:item] forKey:key]; } } newObj = newDict; } return newObj; }
jsonresult({Description =“”; Id = 1; Name = High;},{Description =“”; Id = 2; Name = Medium;},{Description =“”; Id = 3; Name = Low;})
更改null({Description =“”; Id = 1; Name = High;},{Description =“”; Id = 2; Name = Medium;},{Description =“”; Id = 3; Name = Low;} )