【问题标题】:How to convert Realm object to JSON with nested NSDate properties?如何使用嵌套的 NSDate 属性将 Realm 对象转换为 JSON?
【发布时间】:2016-10-06 18:57:10
【问题描述】:

我有一个嵌套的领域对象,嵌套对象中有多个嵌套的NSDate 属性。我正在使用this answer 将嵌套的领域对象转换为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>()

}

【问题讨论】:

    标签: ios json swift dictionary realm


    【解决方案1】:

    iOS 默认序列化器的 JSON 序列化非常严格,大多数类型(包括NSDate)都不能直接序列化。

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

    就目前而言,它只是将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
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-13
      • 2019-09-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 2021-08-27
      • 1970-01-01
      相关资源
      最近更新 更多