我有一个带有多个嵌套的嵌套 Realm 对象NSDate
嵌套对象中的属性。我在用这个答案 https://stackoverflow.com/questions/32023249/how-can-i-convert-a-realm-object-to-json-in-swift将嵌套的 Realm 对象转换为NSDictionary
,但我不知道如何转换它NSDictionary
到实际的 JSON。
当我使用NSJSONSerialization.dataWithJSONObject()
,我收到错误:'Invalid type in JSON write (__NSTaggedDate)'
据我了解,我必须首先转换NSDate
属性到NSString
。问题是我不知道如何进入深层嵌套的对象来做到这一点。
此代码生成'Invalid type in JSON write (__NSTaggedDate)'
error:
let exercises = realm.objects(ExerciseProgram).first
let dic = exercises!.toDictionary()
do {
if let postData: NSData = try NSJSONSerialization.dataWithJSONObject(dic, options: NSJSONWritingOptions.PrettyPrinted) {
let json = NSString(data: postData, encoding: NSUTF8StringEncoding)! as String
print(json)
}
} catch let error as NSError {
print(error)
我的对象的简化版本:
final class ExerciseProgram: Object {
dynamic var name: String = ""
dynamic var startDate = NSDate()
dynamic var userProfile: User?
var program = List<Exercise>()
}
final class Exercise: Object {
dynamic var name = ""
dynamic var notes: String?
var workoutDiary = List<Workout>()
dynamic var goal = 0
}
final class Workout: Object {
dynamic var date = NSDate()
var sets = List<WorkSet>()
}
使用 iOS 默认序列化程序的 JSON 序列化非常严格,并且大多数类型(包括NSDate
) 不能直接序列化。
我查看了尤金在该问题中发布的很棒的代码示例(看起来实际上是从另一个原始问题派生的)。对象的深度似乎并不重要,因为这个扩展似乎被巧妙地设置为在较低级别上递归地调用自身。
就目前而言,它只是复制NSDate
值直接添加到字典中,但是您可以轻松地将另一种情况添加到条件列表中以检测任何情况NSDate
对象,并将它们转换为字符串。这将自动覆盖NSDate
已经存在于字符串版本中的值:
extension Object {
func toDictionary() -> NSDictionary {
let properties = self.objectSchema.properties.map { $0.name }
let dictionary = self.dictionaryWithValuesForKeys(properties)
let mutabledic = NSMutableDictionary()
mutabledic.setValuesForKeysWithDictionary(dictionary)
for prop in self.objectSchema.properties as [Property]! {
// find lists
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 {
let object = nestedListObject._rlmArray[index] as AnyObject
objects.append(object.toDictionary())
}
mutabledic.setObject(objects, forKey: prop.name)
}
else if let dateObject = self[prop.name] as? NSDate {
let dateString = ... ; //Perform the conversion you want here
mutabledic.setValue(dateString, forKey: prop.name)
}
}
return mutabledic
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)