[英]Parsing Nested NSDictionary and NSArray Data in xCode
我有一个复杂的JSON文件,需要将其解析为CoreData表。 当前,我使用这种格式和以下6个元素将数据捕获到NSArray中:
2013-08-29 10:54:04.930 iTrackTest[1542:c07] athleteRecords[0]: @SchoolID
2013-08-29 10:54:04.930 iTrackTest[1542:c07] athleteRecords[1]: @LastName
2013-08-29 10:54:04.930 iTrackTest[1542:c07] athleteRecords[2]: @Gender
2013-08-29 10:54:04.931 iTrackTest[1542:c07] athleteRecords[3]: SchType
2013-08-29 10:54:04.931 iTrackTest[1542:c07] athleteRecords[4]: @FirstName
2013-08-29 10:54:04.931 iTrackTest[1542:c07] athleteRecords[5]: @IDAthlete
第一个问题,似乎SchType是NSDictionaries的k维NSArray。 真的吗?
我一直在使用斯坦福大学的Paul Hegarty的代码捕获更简单的单层JSON文件:
dispatch_async(fetchQ, ^{
NSArray *athleteRecords;
athleteRecords = [AthleticNetDataFetcher retrieveDataForAthleteWithID:athleteID];
NSLog(@"In %@: athleteRecords has %d records",NSStringFromClass([self class]), [athleteRecords count]);
NSLog(@"NSArray with athleteRecords: %@", athleteRecords);
[document.managedObjectContext performBlock:^{
int iCount=0;
for (NSDictionary *athleteInfo in athleteRecords) {
[self resultsWithAthleteInfoForAthleteWithID:athleteInfo inManagedObjectContext:document.managedObjectContext];
NSLog(@"athleteRecords[%d]: %@", iCount, athleteInfo);
iCount++;
}
[document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];
}];
});
我需要CoreData表中每个记录的每个节点的数据元素。 例如,来自School节点的SchoolName,来自Season节点的IDSeason以及来自Results节点的所有元素都将被写入单个CoreData表行(记录)。
我是否需要求助于点符号并放弃通过NSArray进行的迭代,还是需要捕获多个NSArray,每个NSArray的数据都位于节点下方? 很难解决这个问题。
谢谢!
不知道为什么我很难解决这个问题,但是Hot Licks让我步入正轨。
这是我了解到的可能对其他人有用的知识:
如果您在一个数组中嵌入了多个NSDictionaries,则使用其他方法解析这些子字典要简单得多。
+(void)parseDivisionBranches:(NSDictionary *)schTypeDictionary usingStudentInfoFrom:(NSDictionary *)myAthleteInfo
intoManagedDoc: (UIManagedDocument *)document
{
NSArray* schoolDivisions = [self wrapDictionaryInArrayIfNecessary:[schTypeDictionary valueForKeyPath:@"School.SchoolDivision"]];
for (NSDictionary* schoolDivision in schoolDivisions) {
[MarksFromMeets parseDictionaryWithXcMarksForAthlete:(NSString*) [myAthleteInfo objectForKey:@"athlete_ID"]
fromDictionary:(NSDictionary *)schoolDivision
intoThisManagedDoc:(UIManagedDocument *)document];
}
}
在树的特定级别仅传递一个NSDictionary的实例中,将NSDictionary嵌入到NSArray中比较容易,这样您就可以使用相同的代码来提取数据。 因此,我总是检查是否有NSArray或NSDict。
+ (NSArray*) wrapDictionaryInArrayIfNecessary:(NSObject*)dictionaryMasquaradingAsAnArray
{NSMutableArray * newArray = [[NSMutableArray alloc] init];
if([dictionaryMasquaradingAsAnArray isKindOfClass:[NSArray class]]) {
newArray = [dictionaryMasquaradingAsAnArray copy];
}else if([dictionaryMasquaradingAsAnArray isKindOfClass:[NSDictionary class]]) {
[newArray addObject:dictionaryMasquaradingAsAnArray];
}else {
NSString *className = NSStringFromClass([dictionaryMasquaradingAsAnArray class]);
NSLog(@"ERROR - dictionaryMasquaradingAsAnArray of %@ class", className);
newArray = nil;
}
return newArray;
}
然后通过调用与数据树的分支关联的方法依次解析每个子词典,在这种情况下:
+ (void)parseDictionaryWithXcMarksForAthlete:(NSString*)withAthleteID
fromDictionary:(NSDictionary *)dictionary
intoThisManagedDoc:(UIManagedDocument *)document
{
NSArray* seasons = [self wrapDictionaryInArrayIfNecessary:[dictionary valueForKeyPath:@"Season"]];
BOOL* parsedSeasonData;
for (NSDictionary* season in seasons) {
parsedSeasonData = [self parseDictionaryWithSeasonsListings:(NSString*)withAthleteID
fromDictionary:(NSDictionary *)season
intoThisManagedDoc:(UIManagedDocument *)document];
}
}
在某些节点上,我必须捕获数据并将其沿链向下传递以供以后最终将记录写入CoreData时使用。 再次感谢Hot Licks,并希望这对其他人有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.