您的一般方法没有任何问题。自从NSNull
是单例,通过指针比较来查找就可以了。
但是,您不会递归字典中的值。一般来说,这些值本身可能是数组或字典。也许在您的具体情况下您知道它们不是。但如果可以的话,你需要执行removeNullsFromJSONTree:
字典中的每个值。
你也不寻找NSNull
在一个数组中。你应该?处理起来很简单:
[branch removeObject:[NSNull null]];
The removeObject:
方法删除参数的所有实例。
就我个人而言,当我可以使用类别让消息发送系统为我做这件事时,我不喜欢显式测试对象类。所以我可能会定义一个类别NSObject
像这样:
// NSObject+KezRemoveNulls.h
@interface NSObject (KezRemoveNulls)
- (void)Kez_removeNulls;
@end
我会编写一个默认的无所事事的实现NSObject
,并覆盖它NSMutableArray
and NSMutableDictionary
:
// NSObject+KezRemoveNulls.m
#import "NSObject+KezRemoveNulls.h"
@implementation NSObject (KezRemoveNulls)
- (void)Kez_removeNulls {
// nothing to do
}
@end
@implementation NSMutableArray (KezRemoveNulls)
- (void)Kez_removeNulls {
[self removeObject:[NSNull null]];
for (NSObject *child in self) {
[child Kez_removeNulls];
}
}
@end
@implementation NSMutableDictionary (KezRemoveNulls)
- (void)Kez_removeNulls {
NSNull *null = [NSNull null];
for (NSObject *key in self.allKeys) {
NSObject *value = self[key];
if (value == null) {
[self removeObjectForKey:key];
} else {
[value Kez_removeNulls];
}
}
}
@end
请注意,所有实现代码仍然在一个文件中。
现在我可以这样说:
id rootObject = [NSJSONSerialization JSONObjectWithData:...];
[rootObject Kez_removeNulls];