2010-12-13 117 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 
}       

希望这有助于:)