繁体   English   中英

在xCode中解析嵌套的NSDictionary和NSArray数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM