我可以序列化一个RealmObject到JSON或Swift的Realm中的NSDictionary?

我正在testing领域,但我找不到一个简单的方法来将我的对象转换为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 } } 

**对于难看的代码抱歉。

这是我的解决scheme。 使用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 } } 

我也是新来的境界,但我认为最简单的方法是反思对象的模式 :

 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) 

我想我find了解决办法。 我不依赖于performance。

 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 } } 

斯威夫特4

 //getRealmJSON(realmObject: Person(), realmType: Person.self) -> JSON Results func getRealmJSON(realmObject: Object, realmType: Any) -> String { do { let realm = try Realm() let table = realm.objects(realmType as! Object.Type) if table.count == 0 {return "Empty Table"} let mirrored_object = Mirror(reflecting: realmObject) var properties = [String]() for (_, attr) in mirrored_object.children.enumerated() { if let property_name = attr.label as String! { properties.append(property_name) } } var jsonObject = "[" for i in 1...table.count { var str = "{" var insideStr = String() for property in properties { let filteredTable = table.value(forKey: property) as! [Any] insideStr += "\"\(property)\": \"\(filteredTable[i - 1])\"," } let index = insideStr.characters.index(insideStr.startIndex, offsetBy: (insideStr.count - 2)) insideStr = String(insideStr[...index]) str += "\(insideStr)}," jsonObject.append(str) } let index = jsonObject.characters.index(jsonObject.startIndex, offsetBy: (jsonObject.count - 2)) jsonObject = "\(String(jsonObject[...index]))]" return jsonObject }catch let error { print("\(error)") } return "Problem reading Realm" }