需要使用Objective C将新键和值添加到Plist中吗?

时间:2015-12-29 04:51:47

标签: ios objective-c iphone json nsstring

我已将JSON数据存储创建为Plist。现在的问题是在JSON数据存储之后,我需要在dictionary个项目的每个数组中添加两组密钥,如Image_2所示。密钥名称isParent - Boolean YESisChild - Boolean YES {{1}如下面提到的Image_2。

现在我有了plsit数据的结构,它完全适用于下面的代码。

enter image description here

我需要为对象subjectcount外部和objectsubjectcount红色标记数据添加两个键。

enter image description here

levels

NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves | NSJSONReadingMutableContainers error:&error]; NSDictionary *response = JSON[@"response"]; NSArray *keys = [response allKeys]; NSMutableArray *objects = [NSMutableArray new]; for (NSString *key in keys) { NSMutableDictionary *object = response[key]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"subject = %@",object[@"subject"]]; NSArray *objectsWithSameSubject = [objects filteredArrayUsingPredicate:predicate]; NSInteger subjects = [object[@"subject"] integerValue]; if (subjects > 0) { NSMutableArray *Objects_Subjectcount = [NSMutableArray new]; [object setObject:Objects_Subjectcount forKey:@"Objects_Subjectcount"]; for (NSInteger i = 0; i < subjects; i++) { [Objects_Subjectcount addObject:object];// object or anything you need } } [objects addObject:object]; } NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsPath = paths.firstObject; NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"File.plist"]; NSError *writeError = nil; NSDictionary *finalDict = @{@"Objects": objects}; NSData *plistData = [NSPropertyListSerialization dataWithPropertyList:finalDict format:NSPropertyListXMLFormat_v1_0 options:NSPropertyListImmutable error:&writeError]; if(plistData){ [plistData writeToFile:plistPath atomically:YES]; } else { NSLog(@"Error in saveData: %@", error); } 所有数据都由JSON存储,但存储后需要手动添加其他值!多数民众赞成我正在尝试

2 个答案:

答案 0 :(得分:0)

来自response [key]的对象是不可变的,所以不能修改如下:

[object setObject:Objects_Subjectcount forKey:@"Objects_Subjectcount"];

如下所示,它可以通过任何方法添加/删除/设置进行修改。

NSMutableDictionary *object = [response[key] mutableCopy];

希望使用以下修改过的块,您会看到所需的更改。

NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves | NSJSONReadingMutableContainers error:&error];
NSDictionary *response = JSON[@"response"];
NSArray *keys = [response allKeys];

NSMutableArray *objects = [NSMutableArray new];
for (NSString *key in keys) {
    NSMutableDictionary *object = [response[key] mutableCopy];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"subject = %@",object[@"subject"]];
    NSArray *objectsWithSameSubject = [objects filteredArrayUsingPredicate:predicate];
    NSInteger subjects = [object[@"subject"] integerValue];
    if (subjects > 0) {

        [object setObject:@"" forKey:@"level"];
        [object setObject:@(YES) forKey:@"isParent"];

        NSMutableArray *Objects_Subjectcount = [NSMutableArray new];
        for (NSInteger i = 0; i < subjects; i++) {
            [Objects_Subjectcount addObject:@{@"level":@(0), @"isChild":@(YES)}];
        }
        [object setObject:Objects_Subjectcount forKey:@"Objects_Subjectcount"];

    }
    [objects addObject:object];
}

NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = paths.firstObject;
NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"File.plist"];
NSError *writeError = nil;
NSDictionary *finalDict = @{@"Objects": objects};
NSData *plistData = [NSPropertyListSerialization dataWithPropertyList:finalDict format:NSPropertyListXMLFormat_v1_0 options:NSPropertyListImmutable error:&writeError];
if(plistData){
    [plistData writeToFile:plistPath atomically:YES];
}
else {
    NSLog(@"Error in saveData: %@", error);
}

答案 1 :(得分:0)

NSData *plistData = [NSPropertyListSerialization dataWithPropertyList:finalDict format:NSPropertyListXMLFormat_v1_0 options:NSPropertyListMutable error:&writeError];

从plist中检索数据。

NSMutableDictionary *plistDic = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];

现在假设您要更新第一个字典数组

NSMutableArray *array = [[NSMutableArray alloc]init:[plistDic objectAtIndex:0]]

如果你想改变所有的数组数据,你可以做循环...对,我只是使用第一个对象数据..

NSMutableDictionary *dict = [[NSMutableDictionary alloc]init:[array objectAtIncex:0]];
[dict addObject:"yourdata" forKey:"yourkey"];
[array replaceObject:dict atIndex:0];
[plistDic replaceObjectAtIndex:0 withObject:array];

最后

[plistDic writeToFile:plistPath atomically:YES];