【问题标题】:Realm + Swift, nested JSONRealm + Swift,嵌套 JSON
【发布时间】:2016-12-31 19:47:43
【问题描述】:

我在过去 2 天后遇到了问题。我无法将我的 JSON 转换为领域对象。

我有一个像下面这样的 json:

{
  "gender" : "male",
  "id" : "123456789",
  "age_range" : {
    "min" : 21
  },
  "last_name" : "LastName" 
}

我有这个领域模型:

class UserObject: Object {

    dynamic var userId: String = ""
    dynamic var lastName: String?
    dynamic var gender: String?
    var ageRange = List<AgeRangeObject>()

    required convenience init?(_ map: Map) {
        self.init()
    }
}

class AgeRangeObject: Object {

    dynamic var min: Int = 0
}

以及我尝试使用 ObjectMapper 创建此模型的实例以将 json 解析为字典然后创建模型实例的方式:

    let userJSONModel = Mapper<User>().map(jsonString)

    let realm = try! Realm()

    do {
        try realm.write {

            let dict: [String : AnyObject] = [
                "userId" : (userJSONModel?.userId)!,
                "ageRange" : (userJSONModel?.ageRange)!,
                "lastName" : (userJSONModel?.lastName)!,
                "gender" : (userJSONModel?.gender)!
            ]

            let userModel = UserObject(value: dict)

            realm.add(userModel)
        }
    } catch {
        print("Exception")
    }

问题出现在这一行:let userModel = UserObject(value: dict)

我收到以下错误:

*** Terminating app due to uncaught exception 'RLMException', reason: 'Invalid value 'min' to initialize object of type 'AgeRangeObject': missing key 'min''

我正在查看stackoverflow:

Nested Arrays throwing error in realm.create(value: JSON) for Swift

How to convert Realm object to JSON with nested NSDate properties?

但我的情况不同。 你知道那个年龄段的字典有什么问题吗?为什么它不能很好地解析它? 谢谢。

【问题讨论】:

    标签: json swift dictionary realm


    【解决方案1】:

    在您的 JSON 中,ageRange 是一个字典,而 UserObject.ageRange 属性是一个 List&lt;AgeRangeObject&gt;。您的模型不匹配。

    您需要更新模型以反映 JSON 的结构:

    var ageRange = List<AgeRangeObject>()
    

    变成

    dynamic var ageRange: AgeRangeObject? = nil
    

    反之亦然,更新您的 JSON 以反映模型的结构:

    {
      "gender" : "male",
      "id" : "123456789",
      "age_range" : [{
        "min" : 21
      }],
      "last_name" : "LastName" 
    }
    

    【讨论】:

    • 非常感谢! :) 现在我明白了 ;) 我认为 Realm 文档并不清楚这个案例。
    • 如何将 age_range 字典更新为列表对象
    【解决方案2】:
    {
      "key1" : "value1",
      "key2" : "value2",
      "array1" : [{
        "key" : value
      }],
     "key3" : "value3" 
    }
    

    为此,您可以使用 ObjectMapper 的 TransformType。

    参考:https://github.com/APUtils/ObjectMapperAdditions

    我的代码:

    @objcMembers class RealmObject: Object, Mappable {
    
      dynamic var listValues = List<MyRealmObject>()
    
      required convenience init?(map: Map) {
        self.init()
      }
    
     // Mappable
     func mapping(map: Map) {
       listValues <- (map["listValues"], RealmlistObjectTransform())
      }
    
    }
    
    @objcMembers class MyRealmObject: Object, Mappable {
    
        required convenience init?(map: Map) {
          self.init()
        }
    
        // Mappable
        func mapping(map: Map) {
    
        }
      }
    
    class RealmlistObjectTransform: TransformType {
        typealias Object = List<MyRealmObject> // My Realm Object here
        typealias JSON = [[String: Any]] // Dictionary here
    
        func transformFromJSON(_ value: Any?) -> List<MyRealmObject>? {
          let list = List<MyRealmObject>()
          if let actors = value as? [[String: Any]]  {
            let objects = Array<MyRealmObject>(JSONArray: actors)
            list.append(objectsIn: objects)
          }
          return list
        }
    
        func transformToJSON(_ value: List<MyRealmObject>?) -> [[String: Any]]? {
          if let actors = value?.sorted(byKeyPath: "").toArray(ofType: MyRealmObject.self).toJSON() {
            return actors
          }
          return nil
        }
      }
    

    【讨论】:

      猜你喜欢
      • 2020-08-27
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多