RestKit 0.09:映射 JSON 字符串数组

Posted

技术标签:

【中文标题】RestKit 0.09:映射 JSON 字符串数组【英文标题】:RestKit 0.09: mapping JSON array of strings 【发布时间】:2014-06-25 19:26:46 【问题描述】:

我的问题与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":[

  ]

我能够很好地映射“元”(和其他几个域)对象。但我无法映射“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】:

解决方案是创建一个类 (GRConfigDTO),其中包含作为 NSArray 的嵌套对象(品牌、事件类型)。映射很简单:

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

我的前辈已经修改了 RestKit .09(和我们的服务器 JSON)以确保映射永远不会模棱两可,因此总是使用 nil targetClass - 这就是为什么升级 RestKit 不是一个选项的原因。我正在使用 3rd 方服务,并且不得不按原样处理他们的 JSON。

使这一切正常工作的关键是在 sendObject 调用中指定 targetClass:

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

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

【讨论】:

以上是关于RestKit 0.09:映射 JSON 字符串数组的主要内容,如果未能解决你的问题,请参考以下文章

RestKit:给定 RKObjectMapping、object.class 和 JSON 字符串,如何获取映射对象?

Restkit — 如何用可变键名映射 json 对象

如何使用带有 RKObjectMapping 的 RestKit 0.24 将本地 JSON 字符串映射到对象?

IOS - RESTKIT - 以多种方式映射结果

JSON 对象映射 - RestKit

Restkit:来自 JSON parentId 的映射关系