【问题标题】:Can I serialize a RealmObject to JSON or to NSDictionary in Realm for Swift?我可以在 Realm for Swift 中将 RealmObject 序列化为 JSON 或 NSDictionary 吗?
【发布时间】:2015-06-30 23:15:14
【问题描述】:

我正在测试 Realm,但找不到将对象转换为 JSON 的简单方法。 我需要将数据推送到我的 REST 接口。 我怎样才能使用 swift 呢?

class Dog: Object {
  dynamic var name = ""
}

class Person : Object {
  dynamic var name = ""
  let dogs = List<Dog>()
}

我正在尝试这样的事情,但我无法迭代未知对象(列表)

extension Object {
  func toDictionary() -> NSDictionary {
    let props = self.objectSchema.properties.map { $0.name }
    var dicProps = self.dictionaryWithValuesForKeys(props)

    var mutabledic = NSMutableDictionary()
    mutabledic.setValuesForKeysWithDictionary(dicProps)

    for prop in self.objectSchema.properties as [Property]! {

      if let objectClassName = prop.objectClassName  {
        if let x = self[prop.name] as? Object {
          mutabledic.setValue(x.toDictionary(), forKey: prop.name)
        } else {
          //problem here!
        }
      }
    }
    return mutabledic
  }
}

**抱歉代码很丑。

【问题讨论】:

  • 您能否向我们提供您尝试过的内容的来源?

标签: ios swift realm


【解决方案1】:

我也是 Realm 的新手,但我认为最简单的方法是反思 Object's schema

class Person: Object {
    dynamic var name = ""
    dynamic var age = 0
}

let person = Person()

let schema = person.objectSchema

let properties = schema.properties.map() { $0.name }

let dictionary = person.dictionaryWithValuesForKeys(properties) // NSDictionary

println(properties)
println(dictionary)

【讨论】:

  • 谢谢,它工作正常,但不能使用 List 的属性,例如class Person: Object { dynamic var name = "" dynamic var age = 0 let dogs = List&lt;Dog&gt;() }
【解决方案2】:

我认为我找到了解决方案。 我不依赖性能。

extension Object {
  func toDictionary() -> NSDictionary {
    let properties = self.objectSchema.properties.map { $0.name }
    let dicProps = self.dictionaryWithValuesForKeys(properties)

    var mutabledic = NSMutableDictionary()
    mutabledic.setValuesForKeysWithDictionary(dicProps)

    for prop in self.objectSchema.properties as [Property]! {

      if let objectClassName = prop.objectClassName  {
        if let nestedObject = self[prop.name] as? Object {
          mutabledic.setValue(nestedObject.toDictionary(), forKey: prop.name)
        } else if let nestedListObject = self[prop.name] as? ListBase {
            var objects = [AnyObject]()
            for index in 0..<nestedListObject._rlmArray.count  {
              if let object = nestedListObject._rlmArray[index] as? Object {
                objects.append(object.toDictionary())
              }
            }
            mutabledic.setObject(objects, forKey: prop.name)
        }
      }
    }
    return mutabledic
  }
}

【讨论】:

  • 每个Property 都有属性type,即PropertyType。使用它来了解您的属性是否是 Object 而不是 self[...] 查找。
  • 另外,请注意循环引用:当一个对象引用另一个对象时,反之亦然。
  • 不,因为我无法将对象转换为 PropertyType。
  • 不错!但是,嵌套元素的附加不再起作用。当您if letnestedListObject 时,检查总是失败。 Xcode 向该行添加警告:Cast from 'RLMObject' to unrelated type 'Object' always fails。您是否遇到同样的问题?你知道解决方案吗?
【解决方案3】:

这是我的解决方案。使用 unsafeBitCast 来避免强制转换失败警告。

extension Object {
    func toDictionary() -> [String:AnyObject] {
        let properties = self.objectSchema.properties.map { $0.name }
        var dicProps = [String:AnyObject]()
        for (key, value) in self.dictionaryWithValuesForKeys(properties) {
            if let value = value as? ListBase {
                dicProps[key] = value.toArray()
            } else if let value = value as? Object {
                dicProps[key] = value.toDictionary()
            } else {
                dicProps[key] = value
            }
        }
        return dicProps
    }
}

extension ListBase {
    func toArray() -> [AnyObject] {
        var _toArray = [AnyObject]()
        for i in 0..<self._rlmArray.count {
            let obj = unsafeBitCast(self._rlmArray[i], Object.self)
            _toArray.append(obj.toDictionary())
        }
        return _toArray
    }
}

【讨论】:

    猜你喜欢
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2011-01-28
    • 2017-03-29
    相关资源
    最近更新 更多