在JSON序列化的NSUserDefaults中存储[NSNull-null]值会导致不必要的异常



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

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

最近,我尝试在NSUserDefaults中存储一个从JSON对象转换而来的misc NSDictionary层次结构。不幸的是,如果存在null数据,则会导致异常,在IOS中转换为[NSNull-null]。显然,这在预赛中是无法保存的。

我想知道以前有没有人做过这方面的工作?我试图添加一些逻辑来首先从JSON中删除所有null值,但成功率有限,但在存储数据之前必须修改数据似乎不合适。有更好的方法来处理这一问题吗?

您可以首先将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对象。

我尝试过一些递归解决方案,但它们往往很复杂,不能很好地处理混合类型的内容。在最简单的层面上,这里有一个简单的例子,如果你对clean有一个可预测的、简单的响应,那么它会很好地工作。

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

最新更新