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

Mir*_*iro 4 null json nsuserdefaults ios

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

{"data":["one","two","three"],"name":null,otherstuff:10}
Run Code Online (Sandbox Code Playgroud)

最近我试图在NSUserDefaults中存储一个从JSON对象转换的misc NSDictionary层次结构.不幸的是,如果存在空数据,则在IOS中将其转换为[NSNull null]会导致异常.显然,无法保存在prefs中.

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

dad*_*lar 11

您可以先将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];
Run Code Online (Sandbox Code Playgroud)

编辑:正在引用原始数据对象而不是newData对象.


Mir*_*iro 5

我尝试过一些递归解决方案,但它们往往很复杂并且不能很好地处理混合类型的内容。在最简单的层面上,这里是一个平面示例,如果您对 clean 有可预测的、平面的响应,则该示例效果很好。

NSMutableDictionary *dictMutable = [dict mutableCopy];
[dictMutable removeObjectsForKeys:[dict allKeysForObject:[NSNull null]]];
Run Code Online (Sandbox Code Playgroud)