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

我已经创build了JSON数据存储到Plist 。 现在的问题是在JSON数据存储之后,我需要在每个dictionary项目数组中添加两组键,如下面的Image_2。键名isParent - Boolean YESisChild - Boolean YES ,其levels如下所示Image_2。

现在我有下面的数据结构它完全由下面的代码工作。

在这里输入图像说明

我需要在objectcountcount之外添加两个关键字,在objectsubjectcount里面添加红色标记的数据。

在这里输入图像说明

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

NOTE :所有数据以JSON存储,但存储后需要手动添加附加值! 那是我正在尝试

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

响应[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); }