我正在努力寻找将一些JSON映射到RestKit的方法。这是我所看到的一个例子:
"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不会包含"类型"的额外冗余层。作为关键,但这就是生活。
我希望RestKit在"结果"下返回4个对象。类型:
@interface Test : NSObject
@property (nonatomic, copy) NSNumber *testId;
@property (nonatomic, copy) NSString *testName;
@property (nonatomic, copy) NSString *testLanguage;
@property (nonatomic, copy) NSString *testType;
我尝试过不同的映射组合,例如:
RKObjectMapping *testMapping = [RKObjectMapping mappingForClass:[Test class]];
testMapping.forceCollectionMapping = YES;
[testMapping addAttributeMappingFromKeyOfRepresentationToAttribute:@"testType"];
[testMapping addAttributeMappingsFromDictionary:@{
@"(testType).id": @"testId",
@"(testType).name": @"testName",
@"(testType).language": @"testLanguage",
}];
但它仍然失败,因为它不是"类型"下的单个对象。 JSON键 - 它是一个Test对象数组。
有没有办法在RestKit中表示这个映射?或者如果没有,能够覆盖一些回调函数,以便我可以使它工作?不幸的是,我无法更改来自服务器的JSON数据
答案 0 :(得分:2)
我说你最好的办法是创建一个关键路径为@"results"
和dynamic mapping的响应描述符。该映射将返回映射到NSDictionary
并且定义了许多关系的映射。这个字典只是一个容易其他映射(关系)的容器。
通过迭代提供给动态映射的表示的键并使用testMapping
每次迭代创建一个关系来创建关系,但不使用addAttributeMappingFromKeyOfRepresentationToAttribute
,因为您现在可以使用直接属性访问(以及内部type
属性)。
使用setObjectMappingForRepresentationBlock:
,您的阻止随representation
一起提供,在您的情况下,其为反序列化JSON的NSDictionary
。在块中,您可以像往常一样创建映射,但内容基于字典中的键。
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;
}];