0

我有一个复杂的 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 的数据都在节点下方?很难理解这一点。

谢谢!

4

1 回答 1

1

不知道为什么我很难理解这一点,但 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,希望这对其他人有所帮助。

于 2013-09-16T21:00:48.640 回答