NSManagedObject – 如何获取属性的types

我试图parsing一个JSONstring直接进入一个托pipe对象。 JSONstring包含所有string,但我的实体有Date对象。

如果这是我的JSONstring

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

这是我的实体Person:

 name : NSString dob: Date etc... 

我想通过循环Json字典的键来parsing该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。

我怎样才能得到我的实体属性的types/类能够设置各种types?

例如。 如果key = @“dob”我怎么能得到aPerson.dob的types/类?

所以我的代码看起来像这样:

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

谢谢

更新:

好吧,我尝试使用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,不是NSFate!

请告诉我我错过了什么!

我知道,这是一个迟到的答案,但正如我今天search一个很好的解决scheme…这就是我现在使用的:

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

希望这可以帮助 :)

您可以将您的JSONstring转换为NSDate,然后将其分配给您的NSManagedObject,或者您可以在Person类中创build一个自定义设置器,该设置器需要一个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; } 

非常感谢Rog,为了让我朝着正确的方向发展,我最终超越了我的二传手,如下所示:

 -(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行的代码parsing,所有这些都在3个! 好一个!