Json RestKit:带有数组的动态嵌套属性
我正在努力寻找一种将一些JSON映射到RestKit的方法。这是我所看到的一个例子:Json RestKit:带有数组的动态嵌套属性,json,dynamic,attributes,nested,restkit,Json,Dynamic,Attributes,Nested,Restkit,我正在努力寻找一种将一些JSON映射到RestKit的方法。这是我所看到的一个例子: "results":{ "Test1":[ { "id":1, "name":"Test 1 here.", "language":"English", "type: "Test1" }
"results":{
"Test1":[
{
"id":1,
"name":"Test 1 here.",
"language":"English",
"type: "Test1"
}
],
"Test2":[
{
"id":3,
"name":"Another test 2",
"language":"English",
"type":"Test2"
},
{
"id":8,
"name":"More test 2",
"language":"English",
"type":"Test2"
},
{
"id":49,
"name":"foo",
"language":"English",
"type":"Test2"
}
]
}
理想情况下,JSON不会包含额外的冗余层“type”作为键,但这就是生命
我希望RestKit在“结果”下返回4个对象,类型为:
我尝试了不同的映射组合,例如:
RKObjectMapping *testMapping = [RKObjectMapping mappingForClass:[Test class]];
testMapping.forceCollectionMapping = YES;
[testMapping addAttributeMappingFromKeyOfRepresentationToAttribute:@"testType"];
[testMapping addAttributeMappingsFromDictionary:@{
@"(testType).id": @"testId",
@"(testType).name": @"testName",
@"(testType).language": @"testLanguage",
}];
但它仍然失败,因为它不是“type”JSON键下的单个对象——它是一个测试对象数组
有没有办法在RestKit中表示此映射?或者,如果没有,是否能够覆盖一些回调函数,以便我可以使其工作?不幸的是,我无法更改来自服务器的JSON数据。我认为最好的办法是创建一个响应描述符,其关键路径为
@“results”
,并带有一个。该映射将返回一个映射到NSDictionary
的映射,该映射定义了许多关系。此字典只是一个容器,用于促进其他映射(关系)
使用testMapping
,但不使用addAttributeMappingFromKeyOfRepresentationAttribute
,通过迭代提供给动态映射的表示的键,并在每次迭代中创建一个关系来创建关系,因为您现在可以使用直接属性访问(以及内部类型属性)
使用setObjectMappingForRepresentationBlock:
,您的块将被提供表示
,在您的情况下,它是反序列化JSON的NSDictionary
。在块内,您可以像通常一样创建映射,但其内容基于字典中的键
是键(Test1,Test2,…)任意的,或者有一组已知的选项吗?不幸的是,它们是未知的。并且可能有任意数量的选项。感谢您对此的回答。不过,我不太确定我是否了解您。我对RestKit比较陌生,所以我不确定如何实现您所说的内容--您有什么建议可以作为这方面的例子?我已经添加了更多的信息。AFAIK没有这种类型的映射的指南。试试看,如果你有问题,展示你的代码。啊,我现在知道了。这是我遗漏的部分。谢谢!我在另一个项目上转移了注意力,现在又回到了这个项目上。所以,我以为在你的帮助下我已经解决了,但仍然有问题。我理解你创建动态映射并在NSDictionary中获取表示的意思-我已经做到了。我没有理解的部分是如何指定动态数量的目标键路径。在我上面的示例中,我们有两个测试对象的NSArray(一个用于Test1,一个用于Test2)。我如何在类中指定它并动态映射到它(在我的表示块中)?我将返回一个到可变数组的映射,该数组具有每个键的关系,因此映射结果将包含自定义对象数组的字典
RKObjectMapping *testMapping = [RKObjectMapping mappingForClass:[Test class]];
testMapping.forceCollectionMapping = YES;
[testMapping addAttributeMappingFromKeyOfRepresentationToAttribute:@"testType"];
[testMapping addAttributeMappingsFromDictionary:@{
@"(testType).id": @"testId",
@"(testType).name": @"testName",
@"(testType).language": @"testLanguage",
}];
RKObjectMapping *testMapping = [RKObjectMapping mappingForClass:[Test class]];
[testMapping addAttributeMappingsFromDictionary:@{ @"id": @"testId", @"name": @"testName" }];
[dynamicMapping setObjectMappingForRepresentationBlock:^RKObjectMapping *(id representation) {
RKObjectMapping *testListMapping = [RKObjectMapping mappingForClass:[NSMutableDictionary class]];
for (NSString *key in representation) {
[testListMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeypath:key toKeyPath:key withMapping:testMapping];
}
return testListMapping;
}];