【问题标题】:How to do failable mapping of Dictionaries/Arrays to RealmSwift Objects如何将字典/数组映射到 RealmSwift 对象的失败
【发布时间】:2016-12-17 09:01:01
【问题描述】:

上下文

我们有一些来自JSONSerialization.jsonObject()[String: Any] 字典和[[String: Any]] 数组,我们想让它成为Realm Object models 的类实例(下面的例子中假设为PersonModel)。根据 Realm 文档,我们需要设计具有以下属性的模型:

class PersonModel : Object {
    dynamic var id = ""
    dynamic var name = ""
    dynamic var imagePath: String?
    let friends = List<PersonModel>()
    let movies = List<MovieModel>()
}

我们希望制作实例

  • 基于字典创建实例应该是有条件的:即它应该返回一个Person?,因为有时数据是无效的。
  • 基于数组创建列表应仅过滤(或平面映射)有效对象。
  • 字典的键名和类的变量名不匹配:即 JSON 可能有一个“用户名”,但对应的类变量是“名称”。这就是我们无法避免手动映射字典解决方案的原因。

问题

问题

假设我们有这个[[String:Any]] 字典数组:

[["userid": "u1",
  "username": "bob",
  "image": "http://example.com/bob.jpg",
  "friendIds": ["u2", "u3"],
  "movieIds": ["sw4", "sw5", "sw6", "ro"]],
 ["userid": "u2",
  "username": "max",
  "image": "http://example.com/max.jpg",
  "friendIds": ["u1", "u3"],
  "movieIds": ["sw4", "sw5", "sw6", "sw7"]],
 ["userid": "u3",
  "username": false],
]

期望的结果是:

  • “u3”PersonModel 根本没有创建实例,因为它的名称无效。
  • 一个名为 "bob" 和朋友是 List(max) 的 PersonModel 实例。
  • 一个名为 "max" 和朋友是 List(bob) 的 PersonModel 实例。

但是对于我们来说,我们应该如何使用 RealmSwift 来实现这些条件并不明显。我们看不到如何编写代码来解决不可出错的构造函数Realm.create(_:value:update:)。而且我们看不到第三方 JSON 映射器(如 lyft/mapperJohnSundell/Unbox)如何过滤/将给定的不合适的 [[String:Any]] 转换为与 RealmSwift create() 方法兼容的 [[String:Any]]

【问题讨论】:

  • 嘿 - 你是怎么做到的?我们计划将 Lyft Mapper 与 Realm 结合使用。
  • @AsthaGupta 我相信我让Realm.create(_:value:update:) 创建的实例,然后我检查了它们的有效性并立即删除了不正确的实例。

标签: ios json swift initialization realm


【解决方案1】:

来自 Realm 的 Katsumi。我们现在建议使用第三方映射库将 JSON 绑定到 Realm 模型。我认为 ObjectMapper https://github.com/Hearst-DD/ObjectMapper 在映射过程中提供了可失败的初始化程序来验证 JSON 结构。这是给你的答案吗?

【讨论】:

  • 你好,Katsumi。不,它不能很好地回答。在问题中,我们确实提供了指向Realm's doc about JSON 和问题#694 的链接,因为我们已经阅读了这些链接。我们举了一个例子,并询问了如何这些第三方中的任何一个将解决这些问题,并期待一个可以解决的演示。
猜你喜欢
  • 2015-05-16
  • 2016-11-22
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 2015-10-17
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多