如何从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;} )