你好,我有这样的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
你有两个选择:
- 删除带空的键(在本例中,
date
s都在detail
中) - 将字典保存为
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];