我有一个来自Json的Dictionary
我希望存储在UserDefaults
,但我收到错误Attempt to set a non-property-list object <object description here> as an NSUserDefaults/CFPreferences value for key info
。
问题是,我的Dictionary
是一个多级嵌套Dictionary
,里面也有Array
。但是在叶子节点上,所有都只是String
。这大致是结构。
{
data: {
field1: "...",
field2: "...",
field3: [
{
info1: "...",
info2: "...",
info3: "..."
},
{
info1: "...",
info2: "...",
info3: "..."
}
]
}
}
此格式是否无法存储到UserDefaults
?
感谢。
编辑:当我缩小问题范围时,似乎问题出现在field3
的各行中。当我尝试保存field3
ex:field3[0]
的单个行的字典时,它给了我同样的错误。但是如果我删除整个json并删除field3
(设置为nil),我就没问题了。
以下是field3
行的实际内容。
{
"app_setting" = "app_setting_1";
"created_at" = "2017-02-02 19:54:46";
"feedback_name" = "No Toilet Paper";
"feedback_option" = 1;
id = "feedback_option_11";
property = "property_1";
sn = "<null>";
"updated_at" = "2017-02-02 19:54:46";
"url_image_option" = "https://example.com/assets/ios/option1.png";
}
答案 0 :(得分:3)
我们可以设置字典,它就像字符串,数组里面的内容并不重要。
目标C
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
[currentDefaults setObject:urDictionary forKey:@"yourKeyName"];
NSUserDefaults *retrieveDefaults = [NSUserDefaults standardUserDefaults];
NSDictionary *data1 = [retrieveDefaults objectForKey:@"yourKeyName"];
确保首先是字典
将对象转换为NSData
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:urObject];
检索对象
NSData *data1 = [retrieveDefaults objectForKey:@"yourKeyName"];
urObject *retrievedModel = [NSKeyedUnarchiver unarchiveObjectWithData:data1];
Swift 3.0
将字典转换为数据
let dataExample: Data = NSKeyedArchiver.archivedData(withRootObject: dictionaryExample)
NSUserDefaults.standardUserDefaults().setObject(dataExample, forKey:"yourKey")
要检索数据:
NSUserDefaults.standardUserDefaults().objectForKey("yourKey") as! NSDate
let dictionary: Dictionary? = NSKeyedUnarchiver.unarchiveObject(with: dataExample) as! [String : Any]
这就是苹果所说的
NSUserDefaults类提供了访问常用类型(如浮点数,双精度数,整数,布尔值和URL)的便捷方法。默认对象必须是属性列表 - 即(或集合,实例的组合)的实例:NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。如果要存储任何其他类型的对象,通常应将其存档以创建NSData实例。
答案 1 :(得分:0)
只要您使用Dictionary
或UserDefaults Documentation中列出的其他受支持的数据类型,您就可以了。如果是这种情况并且仍然会出错,则表示您正在错误地构建字典。
此解决方案正常运行:
let dict: [String:Dictionary] = [
"data": [
"field1":["a","b","c"],
"field2":["d","e","f"]
],
"otherData": [
"field1":["g","h","i"],
"field2":["j","k","l"]
]
]
UserDefaults.standard.set(dict, forKey: "dict")
UserDefaults.standard.synchronize()