我正在尝试将json字符串直接解析为托管对象。 json字符串包含所有字符串,但我的Entity具有Date对象。
如果这是我的json字符串
{
"name":"John",
"dob": "12/12/2008",
etc...
}
这是我的实体人:
name : NSString
dob: Date
etc...
我想通过循环遍历Json dict的键并将值设置为我的实体的匹配键来直接解析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];
}
}
感谢
更新
好的我尝试使用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,不是OfClass NSDate!
请告诉我我错过了什么!
答案 0 :(得分:3)
我知道,这是一个迟到的答案,但我今天正在寻找一个好的解决方案...... 这就是我现在正在使用的:
NSEntityDescription * myEntity = [object entity];
NSDictionary * attributes = [myEntity attributesByName];
if ([[[attributes objectForKey:key] attributeValueClassName] isEqualToString:@"NSDate"]) {
// this type is NSDate
}
希望这会有所帮助:)
答案 1 :(得分:1)
您可以将JSON字符串转换为NSDate,然后将其分配给NSManagedObject,也可以在Person类中创建一个自定义setter,它接受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;
}
答案 2 :(得分:0)
非常感谢罗格,为了让我朝着正确的方向前进,我最终压倒了我的二传手,如下所示:
-(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中完成! 好一个!