Objective c RestKit任意键对象映射

Objective c RestKit任意键对象映射,objective-c,mapping,restkit,object-object-mapping,Objective C,Mapping,Restkit,Object Object Mapping,我有一个JSON,如下所示: { "key1":[ { "desc":"key1decs.", "duration":50; },{ "desc":"", "duration":90; },{ "desc":"Kurz vor...", "duration":30; } ], "key2":[ { "desc":"key2decs.", "duration":50;

我有一个JSON,如下所示:

 { 
  "key1":[ 
  { 
    "desc":"key1decs.", 
    "duration":50; 
  },{ 
    "desc":"", 
    "duration":90; 
  },{ 
    "desc":"Kurz vor...", 
    "duration":30; 
  } 
 ], 
 "key2":[ 
  { 
    "desc":"key2decs.", 
    "duration":50; 
  },{ 
    "desc":"blabla", 
    "duration":90; 
  } 
] 
} 
我正在尝试做一个映射。但我被困在这里是因为不同的原因 未知/任意密钥。我尝试在没有KVC的情况下进行映射,但似乎没有 工作。给我一个错误: 键路径“key1.desc”处的值转换失败。没有战略 从“\uuu NSArrayI”转换为“NSString”。等等 属性 我在web上看到,没有KVC的映射不支持阵列 内部结构。请帮忙。什么是正确的方法

编辑: 实体:

控制器:

 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];
这是我登录结果时得到的结果:( (无效), (无效), (无效), (无效), (空)
)

我相信您错过了映射的一个“级别”。如果仔细查看输入,就会发现有一个字典(键1),它的内容不是单个的“
Sendung
”,而是这样一个对象数组。因此,您不能将key1的内容直接映射到
Sendung
ivar,而不是创建新类,例如
SendungResult

@interface SendungResult : NSObject
    @property (nonatomic, strong) NSString *keyName;
    @property (nonatomic, strong) NSArray *sendungs;
@end
并使用您现在直接使用的关系映射将key1的内容映射到
SendungResult
sendungs
数组

编辑:我将答案扩展如下:

正如我前面所说的,您正试图将一组对象映射到一个实例中,因此这是行不通的。相反,您必须创建一个
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];
这里没有什么有趣的,我们只是将关键路径映射到您的属性。现在是外部部分

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使用前面定义的映射将keyName keyPath的内容映射到
sendungs
类上的
SendungResult
属性

现在我们可以获取数据了

[[RKObjectManager sharedManager]  loadObjectsAtResourcePath:@"test.js" objectMapping:resultMapping delegate:self];
RestKit将创建两个
SendungResult
实例,每个数组包含内部
Sendung
类(分别为3和2)


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

是的,因为您的key1的内容是一个数组。你能发布你的实体和映射定义吗?我编辑了这个问题。非常感谢。我试着用NSDictionary做这件事,但由于我不知道键,这让我很困惑(无法将描述用作属性。我尝试过。代码如下:NSString url=[[NSString alloc]initWithFormat:@”/sendungen];RKObjectMapping=[RKObjectMappingForClass:[Sendung class]];[映射MapKeyPathToAttributes:@“desc”@“description”@“duration”@“duration”,nil];对于(NSString键入键){RKObjectMapping generalMapping=[RKObjectMapping mappingForClass:[OIdClass]];[generalMapping mapKeyPath:键到属性:@“senders”];[generalMapping mapping mapKeyPath:键到关系:键与映射:映射];[[RKObjectManager sharedManager].mappingProvider setMapping:generalMapping forKeyPath:key];}[[RKObjectManager sharedManager]loadObjectsAtResourcePath:url委托:self];正如您所见,我必须迭代我的键,然后建立每个关系:(结果没有错误,但我得到的是空对象:()我不太明白为什么你必须迭代你的键。请参考我的另一个答案-注意:这个答案涉及发布一个对象数组,但同样的步骤适用于这里,你不需要发送[mapping inverseMapping]选择器。请原谅我对这一切知之甚少,但我对它非常陌生。[syncEntityMapping mapKeyPath:@“mySyncArray”到关系:@“mySyncArray”与映射:mngObjMapping];我应该为KeyPath写些什么?我想这是JSon文档中的密钥。这就是为什么我迭代了它们。我的假设是错误的吗?我只是想如果我可以将它映射到字典中可能会更好?然后所有的密钥都可以保存。有办法吗?非常感谢或答案!我非常感谢!工作得很有魅力!我简直不敢相信不是我自己来的,再次谢谢你!
[[RKObjectManager sharedManager]  loadObjectsAtResourcePath:@"test.js" objectMapping:resultMapping delegate:self];