我可以将 RealmObject 序列化为 JSON 或 Realm 中的 NSDictionary for Swift 吗?

Can I serialize a RealmObject to JSON or to NSDictionary in Realm for Swift?

我正在测试 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 { [=13=].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
  }
}

** 抱歉代码丑陋。

我也是 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() { [=10=].name }

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

println(properties)
println(dictionary)

我想我找到了解决办法。 我不依赖性能。

extension Object {
  func toDictionary() -> NSDictionary {
    let properties = self.objectSchema.properties.map { [=10=].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
  }
}

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

extension Object {
    func toDictionary() -> [String:AnyObject] {
        let properties = self.objectSchema.properties.map { [=10=].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
    }
}