2013-02-17 156 views
5

我正在处理Objective C项目,该项目使用RestKit框架来解析JSON响应。 现在我需要一些帮助的对象映射设置为以下情况: JSON响应:RestKit 0.20 - 动态嵌套对象映射

{ 
    "data": { 
     "SOME.API.Auth": { 
      "maxVersion": 2, 
      "minVersion": 1, 
      "path": "auth.cgi" 
     }, 
     "SOME.Station": { 
      "maxVersion": 1, 
      "minVersion": 1, 
      "path": "Station/task.cgi" 
     } 
    }, 
    "success": true 
} 

及以下对象:

@interface Response : NSObject 
@property (strong, nonatomic) NSArray *data; 
@property (assign, nonatomic) BOOL success; 
@end 


@interface SomeAPIInfo : NSObject 
@property (strong, nonatomic) NSString *name; 
@property (strong, nonatomic) NSString *path; 
@property (strong, nonatomic) NSString *minVersion; 
@property (strong, nonatomic) NSString *maxVersion; 
@end 

这里是我的映射设置:

RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[Response class]]; 
[responseMapping addAttributeMappingsFromDictionary:@{@"success": @"success"}]; 

RKObjectMapping *dataObjectMapping = [RKObjectMapping mappingForClass:[SomeAPIInfo class]]; 
dataObjectMapping.forceCollectionMapping = YES; 
[dataObjectMapping addAttributeMappingFromKeyOfRepresentationToAttribute:@"name"]; 
[dataObjectMapping addAttributeMappingsFromDictionary:@{ 
@"(name).path": @"path", 
@"(name).minVersion": @"minVersion", 
@"(name).maxVersion": @"maxVersion"}]; 


[responseMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"data" 
                       toKeyPath:@"data" 
                      withMapping:dataObjectMapping]]; 

RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:responseMapping 
                        pathPattern:nil 
                         keyPath:nil 
                        statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 


[_objectManager addResponseDescriptor:responseDescriptor]; 

问题是“数据”对象没有正确映射: NSArray * data; 填充了2个“SomeAPIInfo”对象。名称被正确填充,但其他值(路径,maxVersion,minVersion)为空。

我在做什么错? 有没有另外一种方法来映射“数据”对象?也许直接进入NSDictionary,所以“Some.API.Auth”将是关键,“SomeAPIInfo”将是对象(没有“名称”属性)。

感谢您的帮助!

编辑:我认为映射不因为圆点键(“SOME.API.Auth)的工作

RKMappingOperation.m: 
- (NSArray *)simpleAttributeMappings 
{ 
    NSMutableArray *mappings = [NSMutableArray array]; 
    for (RKAttributeMapping *mapping in self.nestedAttributeMappings) { 
     if ([mapping.sourceKeyPath rangeOfString:@"."].location == NSNotFound) { 
      [mappings addObject:mapping]; 
     } 
    } 

回答

0

我碰到了,是由一个错误引起的类似问题在RestKit https://github.com/RestKit/RestKit/issues/1532。我试图通过创建一个假的JSON响应结构相同,但没有点,并看看问题是否仍然存在,以消除可能的点问题。