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

时间:2016-06-07 02:54:06

标签: ios json swift dictionary realm

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

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

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

此代码生成'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>()

}

1 个答案:

答案 0 :(得分:2)

使用iOS的JSON序列化&#39;默认的序列化程序非常严格,大多数类型(包括UPDATE tbl2 t INNER JOIN tbl1 s ON(t.transaction_id = s.id) set t.transaction_id = s.id_trans )都无法直接序列化。

我看了一下Eugene在该问题中发布的令人敬畏的代码示例(看起来实际上是从另一个原始问题中得到的)。对象的深度似乎并不重要,因为看起来这个扩展被巧妙地设置为在较低级别递归调用自己。

就目前而言,它只是将NSDate值直接复制到字典中,但您可以轻松地将另一个案例添加到条件列表中以检测任何NSDate个对象,并将它们转换为字符串。这将自动覆盖已使用字符串版本的NSDate值:

NSDate