2014-06-25 130 views
-1

我的问题与RestKit: mapping JSON array of strings非常相似,只是它特定于RestKit 0.09。我看了其他几个问题,但仍然陷入困境。RestKit 0.09:映射JSON数组字符串

由于我无法控制的原因,我无法升级到RestKit 0.20。我正在使用的JSON是:

{ 
    "brands":[ 
     "AN", 
     "UO", 
     "FP", 
     "TR", 
     "BN" 
    ], 
    "meta":{ 
     "message":"Current Registry Configuration." 
    }, 
    "event_types":[ 
     "WEDDING", 
     "ANNIVERSARY", 
     "BIRTHDAY", 
     "HOUSEWARMING", 
     "SPECIAL OCCASION" 
    ], 
    "links":[ 

    ] 
} 

我能够映射“meta”(和其他几个域)对象就好了。但我无法映射“event_types”,并且不需要“品牌”或“链接”。

我当前的代码如下:

+ (void) addElementMappings:(RKObjectMapping *)mapping 
{ 
    if ([[self superclass] respondsToSelector:@selector(addElementMappings:)]) { 
     [[self superclass] performSelector:@selector(addElementMappings:) 
           withObject:mapping]; 
    } 
    [mapping mapKeyPath:@"event_types" 
      toAttribute:@"eventType"]; 

    RKObjectManager* objectManager = [RKObjectManager sharedManager]; 
    if (![objectManager.mappingProvider mappingForKeyPath:@"event_types"]) { 
     [objectManager.mappingProvider setMapping:mapping 
             forKeyPath:@"event_types"]; // for KVC path 
    } 
} 

和EVENTTYPE是的NSArray(我也尝试将其定义为NSString的 - 相同的结果,如下)。

就这样,代码会抛出一个异常“此类不是关键字event_types的编码兼容关键值”。

如果我从@“event_types”将mapKeyPath更改为nil(类似于0.20),则会出现异常“无法定义映射要映射的元素名称的元素”。

如果我完全省略[mapping mapKeyPath:toAttribute],没有例外,但我只能获取元对象,而不是event_types。

在RestKit 0.09中,如何在不使用密钥的情况下映射属性?

回答

0

解决方案是创建一个包含感兴趣的嵌套对象(品牌,event_types)作为NSArray的类(GRConfigDTO)。映射很简单:

[mapping mapKeyPath:@"brands" 
     toAttribute:@"brands"]; 
[mapping mapKeyPath:@"event_types" 
     toAttribute:@"eventTypes"]; 

我的前任已经修改RestKit 1.09(与我们的服务器JSON),以确保映射是绝不含糊,因此总是用零targetClass - 这就是为什么升级RestKit不是一种选择。我正在使用第三方服务,不得不按照原样处理他们的JSON。

的关键是使所有工作指定targetClass在使用SendObject电话:

[self sendObject:nil 
       path:kConfig 
     requestType:GET 
     targetClass:[GRConfigDTO class] 
      delegate:self 
     callbackMethod:@selector(registryEventTypesResults:error:)]; 

随着targetClass集,RestKit能够按预期执行映射。