如何使用Objective C将JSON解析数据存储到Plist中?

我需要使用objective CJSON解析数据存储到propertylist如下面的结构。

我对服务器的JSON响应:

 {   "response":{      "A":{         "name":"Arun",         "age":"20",         "city":"SFO", "subject":2      },      "B":{         "name":"Benny",         "age":"20",         "city":"SFO", "subject":1  },      "C":{         "name":"Nani",         "age":"30",         "city":"SFO", "subject":0      }   },   "inprogressdata":{   },   "dataspeed":"112 milliseconds..." } 

我正在尝试下面的存储方法到propertylist 。 进入这个属性列表Item 0 , 1, 2它称为JSON响应A, B, C值为Array和Item应作为字典。

NOTE : A, B, C值将根据JSON响应增加,我的意思是它不是静态它可能会达到Z.

在此处输入图像描述

在这个Array值中,每个值都应该存储为dictionary 。 在该字典中需要添加如下所示的字符串值,如果主题数大于0则基于该计数它应该创建字典数组,如下图所示。

在此处输入图像描述

例如 :

 -Root | |-----Objects [Array Value] | |------Item 0(A) [Dictionary Value] | |------name (String) |------age (String) |------city (String) |------subject (Number) // If number 2 then need to create "Objects_Subjectcount" [Array Values] |------Objects_Subjectcount (Array) | |------Item 0 [Dictionary Value] |------Item 1 [Dictionary Value] 

试试这个代码

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

如果我对你的问题的第二部分的理解是正确的,那么代码将是这样的

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

步骤是,

 1. Create JSON with mutable containers and leaves. 2. Iterate through all keys and values. 3. Check whether the subject value of object is greater than 0 in the existing subjects array? if yes add the object to Objects_Subjectcount. Add the object to objects array.(Don't forget to set an NSMutable array with key Objects_Subjectcount) to the object. 4 . Make final dictionary to be written as plist - wrap the objets array in a dictionary with key "objects" 5. Convert the dictionary to plist data and write it 
 NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); // get documents path NSString *documentsPath = [paths objectAtIndex:0]; // get the path to our Data/plist file NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"Data.plist"]; // set the variables to the values in the text fields NSDictionary *plistDict = [NSDictionary dictionaryWithObjects: [NSArray arrayWithObjects: @"pradip", @"25",@"Ahmedabad",@"Computer-Science", nil] forKeys:[NSArray arrayWithObjects: @"Name", @"AGE",@"CITY",@"Subject", nil]]; // create NSData from dictionary NSString *error = nil; NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plistDict format:NSPropertyListXMLFormat_v1_0 errorDescription:&error]; // check is plistData exists if(plistData) { // write plistData to our Data.plist file [plistData writeToFile:plistPath atomically:YES]; } else { NSLog(@"Error in saveData: %@", error); }