将 NSDictionary 从 json 结果保存到 NSUserDefaults 返回"attempt to insert non-property list object"错误



你好,我有这样的json数据

result from 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;
};
}

我想做的是保存这个json结果到NSUserDefaults。以下是我如何节省:在. h

@property NSDictionary *jsonResult;
在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];

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

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

更新:(解决)可能有人有同样的问题,以下是我的工作代码:

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);

我能想到的唯一解释是您的服务器在JSON中向您发送null。当结果被转换为NSDictionary时,NSNull的实例被插入到字典中以表示这些空。

然而,NSNull不是一个属性值,这就是为什么你不能在用户默认值上存储你的字典。正如NSUserDefaults文档所述:

NSUserDefaults类提供了方便的访问方法常见类型,如浮点型、双精度型、整数型、布尔型和url。一个默认对象必须是一个属性列表,即(或)的实例NSData, NSString,NSNumber, NSDate, NSArray,或NSDictionary。如果你想储存对于其他类型的对象,您通常应该将其归档以创建一个NSData. instance

你有两个选择:

  1. 删除带空的键(在本例中,date s都在detail中)
  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;

第二行:

NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary options:kNilOptions error:nil];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:key];

相关内容

最新更新