【发布时间】:2010-12-13 01:00:06
【问题描述】:
我正在尝试将 json 字符串直接解析为托管对象。 json 字符串包含所有字符串,但我的 Entity 有 Date 对象。
如果这是我的 json 字符串
{
"name":"John",
"dob": "12/12/2008",
etc...
}
这是我的实体 Person:
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];
}
这仅在我的所有实体的属性都是 NSString 时才有效。
如何获取实体属性的类型/类以便能够设置各种类型?
例如。 如果键 = @"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,是 notOfClass NSDate!
请告诉我我错过了什么!
【问题讨论】:
-
除了我下面的答案之外,您可以使用 if ([key isEqualToString:"dob"]) { // 创建 NSDate 对象... }
-
感谢 Rog,但我希望使解析更加动态,只获取实体属性的类型,而不必知道密钥的名称,即。 “多布”
-
是的,所有公平点。这是未经测试的使用
if ([[movie valueForKey:key] isKindOfClass:[NSDate class]]) -
我试过了,但由于某种原因,我的 NSDate 属性没有被识别为 kindOfClass NSDate!正如更新中发布的那样。感谢您的帮助。
-
返回的 dob 是什么? NSNull 还是别的什么?