簡體   English   中英

Realm + Swift,嵌套JSON

[英]Realm + Swift, nested JSON

自從過去2天以來我遇到了問題。 我無法將我的JSON轉換為Realm對象。

我有一個像下面這樣的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:

嵌套數組在Swift的realm.create(value:JSON)中拋出錯誤

如何使用嵌套的NSDate屬性將Realm對象轉換為JSON?

但我的情況有所不同。 你知道那個年齡段字典有什么問題嗎? 為什么它不能很好地解析它? 謝謝。

在您的JSON中, ageRange是一個字典,而UserObject.ageRange屬性是List<AgeRangeObject> 你有不匹配的模型。

您需要更新模型以反映JSON的結構:

var ageRange = List<AgeRangeObject>()

dynamic var ageRange: AgeRangeObject? = nil

反之亦然,更新您的JSON以反映模型的結構:

{
  "gender" : "male",
  "id" : "123456789",
  "age_range" : [{
    "min" : 21
  }],
  "last_name" : "LastName" 
}
{
  "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
    }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM