嵌套数组在Swift的realm.create(value:JSON)中抛出错误

时间:2016-05-02 19:28:15

标签: json swift realm

我在我的Swift项目中使用了Realm,并且有一个带有几个嵌套属性的相当长的JSON文件。我知道为了让Realm直接使用这个序列化的JSON数据,属性需要完全匹配(https://realm.io/docs/swift/latest/#json)。

但是因为Realm Lists需要一个Object而不是一个String,所以我必须使用像List这样的需求是一个Realm对象,它包含一个名为' value'的单个字符串。

当我运行此代码时:

  try! realm.write {
    let json = try! NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions())
    let exhibit = Exhibit(value: json)
    exhibit.id = "1"
    realm.add(exhibit, update: true)
  }

我收到此错误消息: ***由于未捕获的异常终止应用程序' RLMException',原因:' req1'初始化类型对象'要求':缺少关键值''

这是我在那里喂养的JSON的缩短版本:

{
    "exhibit_name": "test1",
    "requirements": [
        "req1",
        "req2"
    ],
    "geofence": {
        "latitude": 36.40599779999999,
        "longitude": -105.57696279999999,
        "radius": 500
    }
}

我的Realm模型类是这样的:

class Exhibit: Object {

  override static func primaryKey() -> String? {
    return "id"
  }

  dynamic var id = "0" //primary key
  dynamic var exhibit_name: String = ""
  let requirements = List<Requirements>()
  dynamic var geofence: Geofence?

}

class Geofence: Object {
  dynamic var latitude: Float = 0.0
  dynamic var longitude: Float = 0.0
  dynamic var radius: Float = 0.0
}

class Requirements: Object {
  dynamic var value = ""
}

我觉得有趣的是我没有收到Geofence属性的任何错误,因为那是一本字典。

如何设置需求模型以使其正常工作?

1 个答案:

答案 0 :(得分:1)

很遗憾,您无法以不同的方式设置Requirements模型,这样您就可以直接将JSON映射到Realm对象。

init(value: AnyObject)初始化程序需要字典,其中键是对象属性的名称,或者是数组,其中属性值的排序方式与对象模型中定义的相同。递归调用此初始值设定项用于相关对象。

因此,要使其工作,您需要转换JSON,以便将字符串值嵌套到字典或数组中。在您的具体情况下,您可以实现如下所示:

…
var jsonDict = json as! [String : AnyObject]
jsonDict["requirements"] = jsonDict["requirements"].map { ["value": $0] }
let exhibit = Exhibit(value: jsonDict)
…

旁注

我建议您为Realm模型对象类使用单数名称(此处为Requirement而不是Requirements),因为每个对象只代表一个实体,即使您仅将它们用于 - 许多关系。