2013-08-29 1 views
0

CoreData 테이블로 구문 분석해야하는 복잡한 JSON 파일이 있습니다. 현재, I는 this format와 NSArray를 다음 6 개 요소로 데이터를 캡처 :xcode의 중첩 NSDictionary 및 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를 것 같습니다. 그게 사실이야?

내가 스탠포드 대학의 폴 Hegarty에서 코드를 사용하여 간단한 단일 계층 JSON 파일을 캡처 한 : 내 CoreData 테이블의 모든 레코드에 대한 각 노드의 데이터 요소를 필요

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]; 

    }]; 
}); 

합니다. 예를 들어 학교 노드의 SchoolName, 시즌 노드의 IDSeason 및 결과 노드의 모든 요소가 단일 CoreData 테이블 행 (레코드)에 기록됩니다.

도트 표기법을 사용하고 NSArray를 통해 반복을 포기해야합니까? 아니면 NSArray를 여러 개 캡처해야합니다. 이 일로 제 머리를 쓰는 데 어려움을 겪습니다.

감사합니다.

+1

그것은 단지 배열과 사전에있는 데이터입니다. 한때 JSON이었던 것을 잊어 버리십시오. –

+0

나는 이것에 대해 생각해 보았 기 때문에 나는 나의 질문을 편집했다. 이 데이터가 JSON에서 구문 분석되는 방식을 감안할 때 SchType을 NSDictionaires의 중첩 NSArray로 생각해야합니까? – PhillipOReilly

+0

관련 NSDictionary에 액세스하기 위해 NSArray의 레벨을 반복하는 방법을 파악하는 데 여전히 어려움을 겪고 있습니다. – PhillipOReilly

답변

1

내가 왜 이렇게 힘든 시간을 보냈는지 모르겠지만 Hot Licks는 올바른 길로 나를 잡았습니다. 당신이 배열 내에 포함 된 여러 NSDictionaries이있는 경우, 다른 방법으로 이러한 하위 사전을 구문 분석하는 것이 훨씬 간단

: 여기

내가 그 다른 사람에게 도움이 될 수 배운 것입니다. 단 하나의 NSDictionary와 트리의 특정 수준에서 전달되는 경우에

+(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]; 
    } 
} 

, 당신이 데이터를 추출하기 위해 같은 코드를 사용할 수 있도록 NSArray를 내부에있는 NSDictionary 것을 포함하는 간단하다; 따라서 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) 덕택에 다른 사람들에게 도움이되기를 바랍니다.

+0

축하해 주셔서 감사합니다. 사람들이 그 방법을 배우지 않고 다음번에 아무런 도움이되지 않을지라도 누군가가 그들에게 코드를 쓸 때까지 너무 많은 사람들이 여기에 머물러 있습니다. (좀더 익숙해지면 "JSON 생각하기"를 시작하고 훨씬 적은 노력으로 이러한 것들을 정렬 할 수있을 것이다.) –