2010-12-13 133 views
1

我想解析一個json字符串直接進入一個託管對象。 json字符串包含所有字符串,但我的實體具有Date對象。NSManagedObject - 如何獲得屬性的類型

如果這是我的JSON字符串

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

,這裏是我的實體聯繫人:

name : NSString 
dob: Date 
etc... 

我想通過JSON的字典的鍵循環直通解析JSON和設置值到我的實體的匹配鍵:

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,不是一個類NSDate!

請告訴我,我錯過了什麼!

+0

或者給我的回答如下,您可以運行一個,如果([鍵isEqualToString:「DOB」])上面的代碼{//創建NSDate的對象...} – Rog 2010-12-13 01:11:57

+0

感謝羅格,但我希望讓更多的解析動態,只需拾取實體屬性的類型而不必知道密鑰的名稱即。 「dob」 – Bach 2010-12-13 01:17:25

+0

是的所有公平點。這是未經測試的如何使用'if([[movie valueForKey:key] isKindOfClass:[NSDate class]])' – Rog 2010-12-13 01:42:17

回答

0

非常感謝給羅格,送我在正確的方向,我結束了重寫我的setter方法如下:

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

現在所有的偉大工程,而不是1000行代碼解析,全部完成3! 不錯的一個!

+0

不錯的解決方案,乾淨整潔。感謝您發佈它! – Rog 2010-12-13 04:54:11

1

您可以您的JSON字符串轉換爲NSDate的,然後將其分配給您的NSManagedObject,或者你可以創建你的Person類的自定義設置器,它需要一個NSString,返回的NSDate。這裏有一個例子:

- (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屬性,那麼我可以創建一個NSDate出該json字符串。 – Bach 2010-12-13 01:21:24

+0

我也想過重寫setter以使用NSString創建NSDate,但是每次我想在應用程序中設置「dob」時,我總是會使用字符串。 – Bach 2010-12-13 01:24:32

+1

不一定。您可以傳遞(id)而不是NSString,然後在您的setter中使用'isKindOfClass'進行條件評估。 – Rog 2010-12-13 01:53:13

3

我知道,這是一個遲到的回答,但我今天尋找一個好的解決方案... 這是我使用的是什麼現在:

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

希望這有助於:)