gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:40:38 25 4
gpt4 key购买 nike

我有一个复杂的 JSON 文件,需要将其解析为 CoreData 表。目前,我使用 this format 将数据捕获到 NSArray 中以及以下 6 个元素:

 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,并希望这对其他人有帮助。

关于ios - 在 xCode 中解析嵌套的 NSDictionary 和 NSArray 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18518652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com