gpt4 book ai didi

json - 在 Grails 中将映射和属性列表作为 JSON 持久化

转载 作者:行者123 更新时间:2023-12-03 22:33:54 27 4
gpt4 key购买 nike

编辑:onload() 方法更改为 afterLoad():否则对象可能无法正确传递到 map 。

我目前正在使用一些具有许多动态、复杂属性的域类,我需要定期保留和更新这些属性。

我将它们保存在每个类的 Map 结构中,因为这使得在我的 Controller 等中引用变得容易。

但是,由于 Grails 似乎无法在 DB 中保留像 List 和 Map 这样的复杂属性类型,我使用以下方法通过 JSON String 对象实现这一点:

class ClassWithComplexProperties {

Map complexMapStructure //not persisted
String complexMapStructureAsJSON //updated and synched with map via onload,beforeInsert,beforeUpdate


static transients = ['complexMapStructure']

def afterLoad() { //was previously (wrong!): def onLoad() {
complexMapStructure=JSON.parse(complexMapStructureAsJSON)
}
def beforeInsert() {
complexMapStructureAsJSON= complexMapStructure as JSON
}
def beforeUpdate() {
complexMapStructureAsJSON= complexMapStructure as JSON
}
static constraints = {
complexMapStructureAsJSON( maxSize:20000)
}
}

只要我只从数据库加载数据,这就会很好地工作,但是当我想将更改保存回数据库时会遇到麻烦。例如。当我执行以下操作时
/* 1. Load the json String, e.g. complexMapStructureAsJSON="""{
data1:[[1,2],[3,4]],//A complex structure of nested integer lists
data1:[[5,6]] //Another one
}""" :
*/
ClassWithComplexProperties c=ClassWithComplexProperties.get(1)

// 2. Change a value deep in the map:
c.complexMapStructure.data1[0][0]=7

// 3. Try to save:

c.save(flush:true)

这通常是行不通的,因为,我猜(?),GORM 将忽略 save() 请求,因为 map 本身是 transient 的,并且在持久化的属性中没有发现任何变化。

如果我破解上面的第 3 步并将其更改为:
// 3.Alternative save:
complexMapStructureAsJSON="" //creating a change in persisted property (which will be overwritten anyway by the beforeUpdate closure)
c.save(flush:true)

对我来说,这不是我的问题的一个非常优雅的处理。
问题:
  • 有没有更简单的方法来保存我复杂的动态 map 数据?
  • 如果我需要按照我目前的方式来做,有没有办法避免第 3 步中的黑客攻击?
  • 最佳答案

    对于选项 2,您可以使用 beforeValidate 事件而不是 beforeInsertbeforeUpdate事件以确保更改正确传播。

    class ClassWithComplexProperties {

    Map complexMapStructure //not persisted
    String complexMapStructureAsJSON //updated and synched with map via onload,beforeInsert,beforeUpdate


    static transients = ['complexMapStructure']

    def onLoad() {
    complexMapStructure=JSON.parse(complexMapStructureAsJSON)
    }

    // >>>>>>>>>>>>>>
    def beforeValidate() {
    complexMapStructureAsJSON= complexMapStructure as JSON
    }
    // >>>>>>>>>>>>>>

    static constraints = {
    complexMapStructureAsJSON( maxSize:20000)
    }
    }

    关于json - 在 Grails 中将映射和属性列表作为 JSON 持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8106384/

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