【问题标题】:Grails json cells with enum带有枚举的Grails json单元格
【发布时间】:2011-07-30 04:17:22
【问题描述】:

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

领域类

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

枚举

enum MyEnum {
ENUM1("Value1"),ENUM2("Value2")
//constructor ommitted
String myValue
String toString() { myValue }

Json 单元创建

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

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

【问题讨论】:

    标签: grails groovy enums dns


    【解决方案1】:

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

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

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

    class MyDomain {
        MyEnum enu
    
        def enuVal() {
            enu?.value
        }
    }
    

    def jsonCells = domainList.collect {
        [cell: [
            it.enuVal()
        ],
        ...]
    

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

    【讨论】:

    • 这是有道理的。我可能会这样做只是因为我们大多数人都是刚刚进入 groovy/grails 的 Java 程序员,所以记住调用 it.enuVal() 可能比记住调用 it.enu?.value 更容易。我担心我们会不小心调用它.enu.value,这会完全杀死数据显示:)
    • @Joseph - 如果您总是以相同的方式呈现域,另一种选择是在域上创建一个方法(例如toJson()),该方法返回格式为的属性列表他们需要。但这取决于您的要求和使用情况,我猜。
    猜你喜欢
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多