RestKit:带有数组的动态嵌套属性

时间:2014-03-28 22:00:57

标签: json dynamic attributes nested restkit

我正在努力寻找将一些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数据

1 个答案:

答案 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;
}];