gpt4 book ai didi

json - 嵌套数组在realm.create中抛出错误(值: JSON) for Swift

转载 作者:行者123 更新时间:2023-11-30 10:04:07 26 4
gpt4 key购买 nike

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

但是因为 Realm 列表需要有一个对象而不是字符串,所以我必须使用类似 List 的东西,其中 Requirement 是一个 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 属性的错误,因为它是一本字典。

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

最佳答案

不幸的是,您不能以不同的方式设置您的 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),因为每个对象仅代表一个实体,即使您使用它们仅在对多关系中。

关于json - 嵌套数组在realm.create中抛出错误(值: JSON) for Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36990181/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com