将NSString转换为NSArray并存储在NSUserdefaults中

时间:2015-11-21 22:37:12

标签: ios objective-c json nsarray nsuserdefaults

我有一个从服务器下载的字符串。它采用JSON格式,格式正确。它是一个JSON对象数组。我的目标是将其转换为NSArray,然后将其存储在NSUserDefaults中以供后续使用。我的尝试通常有效,但有时我崩溃了这个错误:

  

尝试设置非属性列表对象

这是我正在使用的代码。我认为这应该是直截了当的。我不相信必须将对象实际转换为NSDictionaries并对此进行迭代,是吗?

NSString *message = [dict objectForKey:@"message"];
NSLog(@"message: %@", message);
data = [message dataUsingEncoding:NSUTF8StringEncoding];
NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

[[NSUserDefaults standardUserDefaults] setObject:arr forKey:RESOURCES_LIST];

例如,这是导致崩溃的字符串之一(由NSLog命令输出):

  

[{"夹":"文档""文件":[{" SORT_ORDER":" 120&#34 ;,"文件名":" pdf.pdf""对文件类型":" PDF"" DISPLAY_NAME":& #34;说明"" UPLOAD_DATE":" 2015年8月11日"" MD5":" ea9f839f91941b5ea7f5a316e3ce95ca"&# 34; bool_external":" 0"" URL":" HTTP://www.somesite.com/pdf.pdf"}]},{ "夹":"图像""文件":[{" SORT_ORDER":" 100"&#34 ;文件名":" space.jpg""对文件类型":"图像"" DISPLAY_NAME":"示例&# 34;," UPLOAD_DATE":" 2015年10月14日"" MD5":" bc63b896949cbf87c54678fee8ed833b"" bool_external&#34 ;:" 0"" URL":" HTTP://www.somesite.com/space.jpg"},{" SORT_ORDER&#34 ;:" 110""文件名":" profile.png""对文件类型":"图像",& #34; DISPLAY_NAME":"简介"" UPLOAD_DATE":"二○一五年十月十四日&#34 ;, " MD5":" 740d61911560e1c84869563b83f3bbf8"" bool_external":" 0"" URL":" HTTP ://www.somesite.com/profile.jpeg"}]},{"夹":"信息""文件&#34 ;: [{& #34; SORT_ORDER":" 130""文件名":"访问3D""对文件类型":" PDF"" DISPLAY_NAME":"信息"" UPLOAD_DATE":" 2015年11月17日"" MD5& #34;:" 926a7941cc9c7f58e43c3eb2de661c27"" bool_external":" 0"" URL":空}]},{"夹":"画""文件":[{" SORT_ORDER":" 130""文件名&#34 ;:" sample_video""对文件类型":"视频"" DISPLAY_NAME":"教学   视频"" UPLOAD_DATE":" 2015年8月11日"" MD5":" -1"" bool_external":" 0"" URL":" HTTPS://www.youtube.com/embed/PuNIwSsz7PI"}]}]

1 个答案:

答案 0 :(得分:1)

            "url": null

(在[2][@"files"][0]中) 这很可能被解析为[NSNull null]的值,无法存储在NSUserDefaults中。您需要更改服务器以作为空字符串发送或根本不发送,或者(递归地)迭代并检查所有值,删除(或替换为@"")所有值为[NSNull null]的键。

作为参考,acceptable classes in plist files and NSUserDefaults是:

  • 数组(NSArray)
  • 字典(NSDictionary)
  • String(NSString)
  • 数据(NSData)
  • 日期(NSDate)
  • Numerics [int32 / 64,float / double](NSNumber)
  • 布尔值(NSNumber)

键必须是字符串。