RestKit 0.09:映射JSON字符串数组

时间:2014-06-25 19:26:46

标签: ios json restkit

我的问题与RestKit: mapping JSON array of strings非常相似,只是它特定于RestKit 0.09。我看了几个其他的问题,但仍然卡住了。

由于我无法控制的原因,我无法升级到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的密码值编码。”

如果我将mapKeyPath从@“event_types”更改为nil(类似于0.20),我会得到一个异常“无法定义一个元素映射元素名称来映射”。

如果我完全省略[mapping mapKeyPath:toAttribute],那么没有例外但当然我只得到元对象,而不是event_types。

在RestKit 0.09中,如何在没有键的情况下映射属性?

1 个答案:

答案 0 :(得分:0)

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

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

我的前辈修改了RestKit .09(和我们的服务器JSON)以确保映射永远不会模糊,因此总是使用nil targetClass - 这就是升级RestKit不是一个选项的原因。我正在使用第三方服务,并且必须按原样处理他们的JSON。

使其全部工作的关键是在sendObject调用中指定targetClass:

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

设置targetClass后,RestKit能够按预期执行映射。