如果您只在字典中存储标准对象,如 NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary 或它们的组合,则无需做任何特别的事情。
但是,如果您在其中有自定义对象的实例(即您创建的类),您首先需要将其转换为兼容的类型(例如NSData
)。您可以使用以下代码执行此操作:
NSData* data=[NSKeyedArchiver archivedDataWithRootObject:json];
[NSUserDefaults standardUserDefaults] setObject:data forKey:@"user"]
要使此方法起作用,您需要在尝试保存的自定义类中实现这两种方法:
- (id)initWithCoder:(NSCoder*)coder
- (void)encodeWithCoder:(NSCoder*)coder;
要从 NSUserDefaults (decode) 中取回字典,您可以使用:
NSData* data = [[NSUserDefaults standardUserDefaults] objectForKey:@"user"];
NSDictionary* json = [NSKeyedUnarchiver unarchiveObjectWithData:data];
编辑
要检查您的json
对象是否包含任何[NSNull null]
值,请在插入之前添加这段代码NSUserDefaults
for (id val in [json allValues])
{
if ([val isKindOfClass:[NSNull class]])
{
NSLog(@"This bad! NSNull should not be in the dictionary");
break;
}
}
如果您This is bad...
在控制台中收到任何消息,那么您有 2 个选择。1. 使用我上面描述的归档/取消归档方法 2.NSNull
如果这不会破坏您的代码,则将字典中的对象替换为其他值(例如空字符串)。