Grails json单元格和枚举

Grails json单元格和枚举,grails,groovy,enums,dns,Grails,Groovy,Enums,Dns,在我的代码中,我有一个带有枚举类型的域对象。该枚举类型从数据库中保存和检索fine。我正在将域对象列表转换为json单元格。除枚举之外的所有字段都是字符串或长字符串。当“在另一端”拾取json时,它会为列显示[Object Object],而不是枚举名称或枚举值。在域或json方面是否有什么东西可以帮助解决这个问题?下面的代码/示例 域类 class MyDomain { long id long otherValue MyEnum enu //Nullable per constraints

在我的代码中,我有一个带有枚举类型的域对象。该枚举类型从数据库中保存和检索fine。我正在将域对象列表转换为json单元格。除枚举之外的所有字段都是字符串或长字符串。当“在另一端”拾取json时,它会为列显示[Object Object],而不是枚举名称或枚举值。在域或json方面是否有什么东西可以帮助解决这个问题?下面的代码/示例

域类

class MyDomain {
long id
long otherValue
MyEnum enu  //Nullable per constraints
//Mapping and constraints are not special. 
}
枚举

Json单元创建

def jsonCells = domainList.collect
    {
        [cell: [
                it.id,
                it.otherValue,
                it.enu?.value
            ],
            id: it.id]
    }

it.enu?.value有效。然而,有没有更好的方法来实现这一点,我不必每次调用值,并且可以依赖对象?我本以为重写toString方法会解决这个问题,但显然我错了。我知道这似乎是一个小问题,但它更容易忘记“.value”,尤其是在许多域对象中将使用相同的枚举时。想法?

由于您在构建对象时只是将其放在列表中,因此除非您专门对其执行其他操作(如您当前正在执行的操作),否则它会将其视为对象

另一种选择是使用
it.enu作为字符串
或类似的东西,但这可能仍然无法实现您想要实现的目标

另一种(可能是过度工程化了?)方法是在域本身上创建一个返回值的方法,然后在构建JSON时使用该方法:

class MyDomain {
    MyEnum enu

    def enuVal() {
        enu?.value
    }
}


至于我,我想我更喜欢在JSON中使用
it.enu?.val
。为您的JSON呈现方法编写一个测试,并确保该值是您期望的值,这样您就不会忘记。

由于您在构建对象时只是将其放在一个列表中,因此除非您专门对其执行其他操作(如您当前正在执行的操作),否则它会将其视为一个对象

另一种选择是使用
it.enu作为字符串
或类似的东西,但这可能仍然无法实现您想要实现的目标

另一种(可能是过度工程化了?)方法是在域本身上创建一个返回值的方法,然后在构建JSON时使用该方法:

class MyDomain {
    MyEnum enu

    def enuVal() {
        enu?.value
    }
}


至于我,我想我更喜欢在JSON中使用
it.enu?.val
。为JSON呈现方法编写一个测试,确保该值是您期望的值,这样您就不会忘记。

这很有意义。我之所以这么做,可能是因为我们大多数人都是刚刚接触groovy/grails的java程序员,所以记住调用它.enuVal()可能比记住调用它.enu?.value更容易。我担心我们会意外地调用它.enu.value,这会完全破坏数据显示:)@Joseph-如果您总是以相同的方式呈现域,另一个选项是只在域上创建一个方法(例如
toJson()
),该方法返回按需要格式化的属性列表。但我想这取决于你的需求和使用,这是有道理的。我之所以这么做,可能是因为我们大多数人都是刚刚接触groovy/grails的java程序员,所以记住调用它.enuVal()可能比记住调用它.enu?.value更容易。我担心我们会意外地调用它.enu.value,这会完全破坏数据显示:)@Joseph-如果您总是以相同的方式呈现域,另一个选项是只在域上创建一个方法(例如
toJson()
),该方法返回按需要格式化的属性列表。但我想这取决于你的需求和使用。
def jsonCells = domainList.collect {
    [cell: [
        it.enuVal()
    ],
    ...]