在NSUserDefaults中存储值(来自JSON序列化)会导致不需要的exception

我有一个应用程序,我使用基于JSON的API。 作为JSON的一部分,常常将值设置为“null”。 这可能是常见的:

{"data":["one","two","three"],"name":null,otherstuff:10} 

最近我试图在NSUserDefaults中存储一个从JSON对象转换来的misc NSDictionary层次结构。 不幸的是,如果有空数据,在IOS中将其转换为[NSNull null],则会导致exception。 显然,不能保存在首选项。

我想知道有没有人曾经解决这个问题? 我试图添加一些逻辑来首先从JSON中删除所有的空值,但成功有限,但是在存储数据之前修改数据似乎不合适。 有没有更好的方法来处理这个问题?

您可以先将NSDictionary转换为NSData,然后安全地存储在NSUserDefaults中(因为NSNull符合NSCoding)。

 //archive NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dictionary]; [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"key"]; //unarchive NSData *newData = [[NSUserDefaults standardUserDefaults] objectForKey:@"key"]; NSDictionary *newDict = [NSKeyedUnarchiver unarchiveObjectWithData:newData]; 

编辑:原始数据对象被引用,而不是newData对象。

我已经尝试了一些recursion的解决scheme,但它们往往是复杂的,不能很好地处理混合types的内容。 在最简单的层面上,这是一个平坦的例子,如果您对清洁有一个可预测的平坦的反应,那么这个例子可以很好地工作

 NSMutableDictionary *dictMutable = [dict mutableCopy]; [dictMutable removeObjectsForKeys:[dict allKeysForObject:[NSNull null]]];