将NSDictionary从json结果保存到NSUserDefaults会返回"尝试插入非属性列表对象"错误

Her*_*adi 0 objective-c ios

你好我有这样的json数据

来自NSLog的结果(@"JSON sec blnce list:%@",responseObject);:

{
detail =     (
            {
        account = 9X000101300160;
        balance = "1.000.000";
        date = "<null>";
        price = 0;
        secCode = 9999;
        type = Blocked;
        value = 0;
    },
            {
        account = 9X000101300160;
        balance = "1.000.000";
        date = "<null>";
        price = 0;
        secCode = 9999;
        type = Available;
        value = 0;
    }
);
header =     {
    date = 24092012;
    investorID = IDD010239865303;
    securityType = Equity;
};
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是将这个json结果保存到NSUserDefaults中.这是我如何保存:在.h

@property NSDictionary *jsonResult;
Run Code Online (Sandbox Code Playgroud)

在.m

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
        [manager.requestSerializer setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

        [manager POST:URI_SECURITY_BALANCE_DETAIL parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {

            [SVProgressHUD dismiss];


            NSLog(@"JSON sec blnce list: %@", responseObject);

            self.jsonResult = responseObject;

            //simpan hasil query ke device
            NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
            [defaults setObject:self.jsonResult forKey:@"securityBalanceNextJsonResult"];
            [defaults synchronize];
Run Code Online (Sandbox Code Playgroud)

但上面的代码给我一个错误:"尝试设置非属性列表对象"

我如何保存从json结果到NSUserDefaults的NSDictionary?

更新:(已解决)可能是有人有同样的问题,这里是我的工作代码如何:

self.jsonResult = responseObject;

        NSData *data = [NSJSONSerialization dataWithJSONObject:self.jsonResult options:kNilOptions error:nil];
        [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"securitiesBalanceJsonResult"];

        NSError* error;
        NSDictionary* jsonDB = [NSJSONSerialization
                              JSONObjectWithData:[defaults objectForKey:@"securitiesBalanceJsonResult"]

                              options:kNilOptions 
                              error:&error];

        NSLog(@"data:%@",jsonDB);
Run Code Online (Sandbox Code Playgroud)

rti*_*o42 7

我能想到的唯一解释是你的服务器在JSON中发送空值.当结果转换为a时NSDictionary,会将实例NSNull插入到字典中以表示这些空值.

但是,NSNull这不是属性值,这就是为什么您无法将字典存储在用户默认值上的原因.正如NSUserDefaults文档所述:

NSUserDefaults类提供了访问常用类型(如浮点数,双精度数,整数,布尔值和URL)的便捷方法.默认对象必须是属性列表,即(或集合的实例组合)的实例:NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary.如果要存储任何其他类型的对象,通常应将其存档以创建NSData实例.

您有两种选择:

  1. 删除带空值的键(在示例中,两者都datedetail).
  2. 将字典保存为NSData.

为了第一:

NSMutableDictionary *mutable = [dictionary mutableCopy];
NSArray *array = mutable[@"detail"];
NSMutableArray *mut = [NSMutableArray arrayWithCapacity:[array count]];
for (NSDictionary *d in array)
{
    NSMutableDictionary *m = [NSMutableDictionary dictionary];
    for (NSString *k in d) {
        id v = d[k];
        if (![v isKindOfClass:[NSNull class]]) {
            m[k] = v;
        }
    }
    [mut addObject:m];
}
mutable[@"detail"] = mut;
Run Code Online (Sandbox Code Playgroud)

对于第二个:

NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary options:kNilOptions error:nil];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:key];
Run Code Online (Sandbox Code Playgroud)

  • "<null>"是NSNull实例作为其描述返回的内容.如果你记录一个NSNull,那就是你将在控制台中获得的内容. (3认同)