2011-11-17 141 views
4

我有一个JSON看起来像这样的位置:RestKit任意键对象映射

{ 
    "key1":[ 
    { 
    "desc":"key1decs.", 
    "duration":50; 
    },{ 
    "desc":"", 
    "duration":90; 
    },{ 
    "desc":"Kurz vor...", 
    "duration":30; 
    } 
], 
"key2":[ 
    { 
    "desc":"key2decs.", 
    "duration":50; 
    },{ 
    "desc":"blabla", 
    "duration":90; 
    } 
] 
} 

我试图做一个映射。但我因为不同的/不同的密钥而被卡住了。我试图没有KVC的映射,但似乎不是 正在工作。给我的错误: 失败的keyPath'key1.desc'处的值转换。 没有策略从'__NSArrayI'转换为'NSString'。等等每 属性。 我在网上看到,没有KVC的映射不支持数组作为 内部结构。 Plz,帮忙。这里的正确方法是什么?

编辑: 实体:

@interface Sendung : NSObject 

@property (nonatomic, strong) NSString *description; 
@property (nonatomic, strong) NSNumber *duration; 
@property (nonatomic, strong) NSNumber *sendungkey; 
@end; 

控制器:

RKObjectMapping* mapping = [RKObjectMapping mappingForClass:[Sendung class]]; 
mapping.forceCollectionMapping = YES; 
[mapping mapKeyOfNestedDictionaryToAttribute:@"sendungkey"]; 
[mapping mapKeyPath:@"(sendungkey).desc" toAttribute:@"description"]; 
[mapping mapKeyPath:@"(sendungkey).duration" toAttribute:@"duration"]; 
[[RKObjectManager sharedManager].mappingProvider addObjectMapping:mapping ]; 
mapping = [[RKObjectManager sharedManager].mappingProvider objectMappingForClass:[Sendung class] ]; 
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:url objectMapping:mapping delegate:self]; 

这是我得到的时候NSlogin结果:( (空), (空), (空) (null), (null) )

+0

是的,因为你的key1的内容是一个数组。你可以请张贴你的实体以及映射定义吗? – mja

+0

我编辑了这个问题。谢谢!我尝试使用NSDictionary,但由于我不知道密钥,这使我很困惑( – Nigul

+0

不能使用描述作为属性。 –

回答

5

我相信你错过了你的映射的一个'水平'。如果仔细查看输入内容,则可以使用字典(key1),其中的内容不是单个'Sendung',而是一组这样的对象。因此,您不能将密钥1的内容直接映射到Sendung ivars,而不是创建新的类,例如SendungResult

@interface SendungResult : NSObject 
    @property (nonatomic, strong) NSString *keyName; 
    @property (nonatomic, strong) NSArray *sendungs; 
@end 

和使用现在直接使用关系映射KEY1的内容映射到SendungResultsendungs阵列。

编辑:我延长了答案如下:

正如我刚才所说,你正试图对象的集合映射到单个实例,所以这是行不通的。相反,您必须创建一个SendungResult,它将为一个密钥保存Sendung实例的数组。因此,在您的示例中,最终将有两个SendungResult实例(其中一个将保存三个Sendung s - 嵌套在"key1"之下,第二个嵌套在"key2"之下)。您不能将这种类型的结构映射到一次类,您必须以与JSON嵌套相同的方式嵌套它们。 Sendung类基本不变。

现在进行映射。您需要定义两个映射,其中一个将映射根目录JSON的内容为两个SendungResult(每个键一个),第二个映射将映射内部部分为单个Sendung实例。

我们从内部映射开始。

RKObjectMapping *sendungMapping = [RKObjectMapping mappingForClass:[Sendung class]]; 
[sendungMapping mapKeyPath:@"desc" toAttribute:@"desc"]; 
[sendungMapping mapKeyPath:@"duration" toAttribute:@"duration"]; 
[[[RKObjectManager sharedManager] mappingProvider] addObjectMapping:sendungMapping]; 

这里没有什么真正有趣的,我们只是将keypath映射到您的属性。现在是外面的部分。

RKObjectMapping *resultMapping = [RKObjectMapping mappingForClass:[SendungResult class]]; 
[resultMapping setForceCollectionMapping:YES]; 
[resultMapping mapKeyOfNestedDictionaryToAttribute:@"keyName"]; 
[resultMapping mapKeyPath:@"(keyName)" toRelationship:@"sendungs" withMapping:sendungMapping]; 
[[[RKObjectManager sharedManager] mappingProvider] addObjectMapping:resultMapping]; 

我们告诉RestKit到的键名的keyPath的内容映射到SendungResult类与早期定义的映射发现sendungs财产。

现在我们可以获取数据

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"test.js" objectMapping:resultMapping delegate:self]; 

的RestKit将创建两个SendungResult实例中,每个阵列包含内Sendung类(3和2,分别地)

注:我强烈建议你可以阅读RestKit Object Mapping文档。另外,JSONLint发现你的JSON无效,我不得不删除分号。所以一定要使用有效的json。

+0

我试了。这是代码: NSString * url = [[NSString alloc ] initWithFormat:@ “/ sendungen”]; RKObjectMapping *映射= [RKObjectMapping mappingForClass:[Sendung类]]; [映射mapKeyPathsToAttributes: @ “DESC”,@ “描述”, @ “持续时间”,@”持续时间”, 零]; – Nigul

+0

为(在键的NSString *键){ RKObjectMapping * generalMapping = [RKObjectMapping mappingForClass:[OIdClass类]]; [generalMapping mapKeyPath:键toAttribute:@ “发送者”]; [generalMapping mapKeyPath:key toRelationship:key withMapping:mapping]; [[RKObjectManager sharedManager] .mappingProvider setMapping:generalMapping forKeyPath:key]; } [[RKObjectManager sharedManager] loadObjectsAtResourcePath:url delegate:self]; 正如你所看到的,我必须遍历我的密钥,然后才能使每个关系:( 结果是没有错误,但我得到空对象:() – Nigul

+0

我不完全遵循为什么你必须迭代你的密钥。请参考我的另一个答案 - http://stackoverflow.com/questions/7726437/restkit-how-does-one-post-an-array-of-objects/7726829#7726829注意:该答案处理张贴数组objets,但是同样的步骤适用于这里,你只需要发送[mapping inverseMapping]选择器。 – mja