RestKit 的动态映射会解决这个复杂的 JSON 映射吗?

Posted

技术标签:

【中文标题】RestKit 的动态映射会解决这个复杂的 JSON 映射吗?【英文标题】:Will RestKit's dynamic mapping solve this complex JSON mapping? 【发布时间】:2013-10-04 19:49:16 【问题描述】:

我在我的应用中使用 RestKit,它需要使用现有的同步服务,以这种方式构造传入数据:


  "timestamp": 000000000001,
  "status" : 0,
  "syncData":[
    
      "errors":[],
      "rows":[ "name":"AAA", ...,
               "name":"BBB", ..., 
               ...],
      "rtype":"FOO" ,
    
      "errors":[],
      "rows":[ "id":1, "description":"ZZZ", ....,
               "id":2, "description":"YYY", ...., 
               ...],
      "rtype":"BAR"
    , ...

我是 RestKit 新手,并试图找出解决此问题的最佳方法,以及将相同结构的数据发送回服务器的补充问题。我正在将 Core Data 与 RestKit 一起使用。

我已经映射了一个 SyncResponse 实体来保存***数据,我想从中得到的是 FOO 对象的集合,“AAA”、“BBB”等,以及 BAR 对象的集合、“ZZZ”、“YYY”等,以及其他几十个对象的集合,其类由“rtype”字段指示。

我已阅读有关动态映射的文档部分以及此处的一些示例代码和帖子,但我不知道在这种情况下动态映射是如何工作的,因为它不是"a":is A, "b":is B 格式。这是否可以使用动态映射,如果可以,我在这里缺少什么概念?

假设有可能,我如何从 FOO 和 BAR 的集合开始发回数据,当然用 SyncUpdateRequest 包装器之类的东西替换 SyncResponse?

【问题讨论】:

棘手,因为映射会希望 syncData 包含所有相同的项目。 syncData可以有很多不同的类型,类型的顺序可以改变吗? 订单可能不会改变,不是没有通知,但它会包含许多不同的类型。我现在必须处理大约 20 个。我可以拦截每个匹配的尝试并为每个提供不同的映射吗? 【参考方案1】:

我认为您无法单独使用一组映射来做到这一点。

您最好的选择可能是为每个项目创建映射,并为整体结构创建一个映射。整体映射只是将数组提取为字典的NSArray。获得数组后,您可以自己对其进行迭代,检查类型,然后应用 RKMapperOperation 来执行映射。


对于发送您的更新请求,我将其视为一个完全不同的事情。我会构建一个字典数组,其中字典有一些信息的“普通”键/值对和rows 的“复杂”键/值对。然后,您的请求映射是根据这个字典数组(涵盖自定义部分)和行(应该是类的响应映射的倒数)。然后 RestKit 应该能够以标准方式处理它(与上面的响应映射的复杂性相比)。

【讨论】:

谢谢。这是有道理的,并且可能是实现此功能的最快方法,但是我如何表明我想要返回一个字典数组? RestKit 检查数据类型或映射目标以决定做什么。因此,请在目标类上创建 NSMutableArray 属性或将映射类设置为 NSMutableArray,具体取决于您将如何管理流程。 好的,谢谢 Wain,它让我获得了字典和数组形式的数据。但是我没有找到太多关于如何为这种用途设置 RKMapperOperation 的信息。我认为我需要创建 FOO 和 BAR 映射并传递每个“行”对象的值?我要去试一试! 我使用 RKMapperOperation 编写了一个解决方案。映射器返回 mapper.mappingResult 中的对象,但它们似乎是源字典。我希望它们映射到 Core Data NSManagedObject 对象。不是在等待队列完成映射吗? RKMapperOperation 标头没有具体说明如何获取队列的句柄,我找不到使用它的真实示例。我错过了什么? 您可能想开始一个新问题,以便显示代码。

以上是关于RestKit 的动态映射会解决这个复杂的 JSON 映射吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Objective C 中使用 RestKit 解析复杂的 JSON

RestKit 对象映射:如何从键值映射到新对象/关系?

使用 restkit 映射到复杂对象

RestKit 对象建模动态数据

Restkit 映射复杂的嵌套数组

Restkit 请求动态映射