2010-12-13 5 views
1

json 문자열을 관리되는 개체로 직접 구문 분석하려고합니다. json 문자열에 모든 문자열이 포함되어 있지만 Entity에 Date 객체가 있습니다. 내가 JSON의 DICT의 키를 통해 반복에 의해 직선을 통해 그 JSON을 구문 분석 할NSManagedObject - 속성 형식을 얻는 방법

name : NSString 
dob: Date 
etc... 

및 설정 :

이 여기 내 JSON 문자열

{ 
"name":"John", 
"dob": "12/12/2008", 
etc... 
} 

하고있는 경우 내 엔티티 사람의 내 개체의 일치하는 키 값 : 모든 경우

Person *aPerson = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:managedObjectContext]; 
NSArray *keys = [jsonDict allKeys]; 

for (NSString *key in keys) { 

[aPerson setValue:[jsonDict valueForKey:key] forKey:key]; 

} 

이 유일한 작품 내 엔티티의 속성은 NSStrings입니다.

다양한 유형을 설정할 수 있도록 내 엔티티 속성의 유형/클래스를 얻으려면 어떻게해야합니까?

예 : key = @ "dob" aPerson.dob의 유형/클래스를 얻으려면 어떻게해야합니까?

그래서 내 코드는 같은 모양 :

Person *aPerson = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:managedObjectContext]; 
NSArray *keys = [jsonDict allKeys]; 

for (NSString *key in keys) { 
    if([[aPerson objectForKey:key] isKindOfClass:[NSDate class]]) 
    { 
     // Create an NSDate object 
    }else{ 
     [aPerson setValue:[jsonDict valueForKey:key] forKey:key]; 
    } 
} 

감사

UPDATE : 내가 여기 isKindOfClass을 사용하여 시도 및

확인 결과가되었다입니다 :

// for key = @"name" 
// aPerson.name is NSString 
[[aPerson valueForKey:key] isKindOfClass:[NSString class]] => TRUE 
[[aPerson valueForKey:key] isKindOfClass:[NSObject class]] => TRUE 

// for key = @"age" 
// aPerson.age is NSNumber 
[[aPerson valueForKey:key] isKindOfClass:[NSNumber class]] => TRUE 
[[aPerson valueForKey:key] isKindOfClass:[NSObject class]] => TRUE 

// for key = @"dob" 
// aPerson.dob is NSDate 
[[aPerson valueForKey:key] isKindOfClass:[NSDate class]] => FALSE 
[[aPerson valueForKey:key] isKindOfClass:[NSObject class]] => FALSE 

어때? @dynamic dob 및 NSDate는 notOfClass NSDate입니다!

제가 누락 된 부분을 알려주십시오.

+0

아래의 내 대답을 대신 위의 코드를 if ([key isEqualToString : "dob"]) {// NSDate 개체 만들기 ...} – Rog

+0

감사합니다. Rog,하지만 구문 분석을보다 역동적으로 만들려고했습니다. 즉, 키의 이름을 알 필요없이 엔터티의 유형 즉, 유형을 선택합니다. "dob" – Bach

+0

모든 공정한 점.이것은 if ([[movie valueForKey : key] isKindOfClass : [NSDate class]])를 사용하여 테스트되지 않았습니다. – Rog

답변

0

감사 로저을 많이, 나는 다음과 같이 내 세터를 무시 결국 코드 파싱의 1000 라인, 그것은 모두 3에서 끝났어! 좋은 소식! 내가 아는

+0

좋은 솔루션, 깨끗하고 & 깔끔. 게시 해 주셔서 감사합니다! – Rog

1

JSON 문자열을 NSDate로 변환 한 다음 NSManagedObject에 할당하거나 Person 클래스에 NSString을 사용하고 NSDate를 반환하는 사용자 정의 설정기를 만들 수 있습니다. 다음은 예입니다 :

-(void)setDob:(id)value 
{ 
    [self willAccessValueForKey:@"dob"]; 
    if ([value isKindOfClass:[NSString class]]) { 
     [self setPrimitiveValue:[DateFormatter dateFromString:value] forKey:@"dob"]; 
    }else{ 
     [self setPrimitiveValue:value forKey:@"dob"]; 
    } 
    [self didChangeValueForKey:@"dob"]; 
} 

모든 이제 좋은 작품을, 대신의 : 올바른 방향으로 날을 보내기 위해,

- (NSDate*)convertStringToDate:(NSString*)dateString { 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    // this is imporant - we set our input date format to match our input string 
    // if format doesn't match you'll get nil from your string, so be careful 
    [dateFormatter setDateFormat:@"d MMMM yyyy"]; 
    NSDate *dateFromString = [dateFormatter dateFromString:dateString]; 
    [dateFormatter release]; 
    return dateFromString; 
} 
+0

감사합니다. 그러나 나는 여전히 문자열을 날짜로 변환해야하는지 알 필요가 있습니다. person.xx에서 xx의 유형을 알아야 객체를 동적으로 생성 할 수 있습니다. 예. person.dob, person.loginDate 등 ... 둘 다 NSDate 속성이라는 것을 알 수 있다면 그 json 문자열에서 NSDate를 만들 수 있습니다. – Bach

+0

NSDate를 만들기 위해 NSString을 사용하도록 setter를 재정의하는 방법을 생각했지만 내 응용 프로그램에서 "dob"를 설정할 때마다 항상 문자열을 사용하도록 바인딩됩니다. – Bach

+1

반드시 그렇지는 않습니다. NSString 대신 (id)를 전달한 다음 setter 내에서 isKindOfClass를 사용하여 조건부 평가를 수행 할 수 있습니다. – Rog

3

,이 늦은 답변입니다,하지만 난 좋은 솔루션에 대한 검색 오늘이었다로 ... 이것은 내가 지금 사용하고 무엇을 :

NSEntityDescription * myEntity = [object entity]; 
NSDictionary * attributes = [myEntity attributesByName]; 
if ([[[attributes objectForKey:key] attributeValueClassName] isEqualToString:@"NSDate"]) { 
    // this type is NSDate 
}       

희망이 도움이 :)

관련 문제