如何将Realm对象转换为嵌套的NSDate属性的JSON?

我有一个嵌套的Realm对象与嵌套对象中的多个嵌套的NSDate属性。 我正在使用这个答案将嵌套的Realm对象转换为NSDictionary ,但我不知道如何将该NSDictionary转换为实际的JSON。

当我使用NSJSONSerialization.dataWithJSONObject() ,我得到的错误: 'Invalid type in JSON write (__NSTaggedDate)'

从我的理解,我必须首先将NSDate属性转换为NSString 。 问题是我不知道如何进入深度嵌套的对象来做到这一点。

此代码生成'Invalid type in JSON write (__NSTaggedDate)'错误中的'Invalid type in JSON write (__NSTaggedDate)'

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

JSON序列化与iOS的默认串行器是相当严格的,大多数types(包括NSDate )不能直接序列化。

我看了一下Eugene在这个问题上发布的真棒代码示例(看起来像是从另一个原始问题实际得到的)。 对象的深度似乎并不重要,因为看起来这个扩展巧妙地设置为在较低层上recursion地调用它自己。

现在,它只是直接将NSDate值复制到字典中,但是您可以轻松地将其他情况添加到条件列表中,以检测任何NSDate对象,并将其转换为string。 这将自动覆盖已经在那里的string版本的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 } }