Objective c RestKit任意键对象映射
我有一个JSON,如下所示: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;
{
"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];