Grails中从JSON到enum的绑定

Grails中从JSON到enum的绑定,grails,Grails,运行Grails2.4.2时,我无法从JSON字符串获取绑定的枚举。我认为声明一个接受值的构造函数可以解决这个问题,但事实并非如此。我还尝试传递名为“GENERIC”的JSON,它也没有绑定 如果值以字符串形式提交,则可以绑定到枚举。但这意味着改变默认情况下为绑定而输入的枚举JSON与呈现的JSON的方式。例如,这是有效的: {"id":null,"templateCode": "GENERIC"} 从JSON绑定枚举的正确/最佳方法是什么 class EmailTemplate {

运行Grails2.4.2时,我无法从JSON字符串获取绑定的枚举。我认为声明一个接受值的构造函数可以解决这个问题,但事实并非如此。我还尝试传递名为“GENERIC”的JSON,它也没有绑定

如果值以字符串形式提交,则可以绑定到枚举。但这意味着改变默认情况下为绑定而输入的枚举JSON与呈现的JSON的方式。例如,这是有效的:

{"id":null,"templateCode": "GENERIC"}
从JSON绑定枚举的正确/最佳方法是什么

class EmailTemplate {
    TemplateCode templateCode
}


public enum TemplateCode {
    GENERIC('Generic template'),
    CUSTOM('Custom template')

    final String value

    EmailTemplateCode(String value) {
        this.value = value
    }

    String getKey() {
        name()
    }

    String toString() {
        value
    }
}
在Bootstrap.groovy中

JSON.registerObjectMarshaller(Template) {
    def map = [:]
    map['templateCode'] = it.templateCode
    return map
}

JSON.registerObjectMarshaller(TemplateCode) {
    def map = [:]
    map['name'] = it.name
    map['value'] = it.value
    return map
}
正在发送的JSON是

{"id":null,"templateCode":{"key":"GENERIC","value":"Generic template"}}
编辑:简化版

如果我们将在基础上使用enum,则:

public enum TemplateCode {
    GENERIC,CUSTOM
}
Grails将把它呈现给JSON,如下所示:

templateCode:  { enumType: com.EmailTemplateCode, name: GENERIC}
但是,发布相同的JSON字符串将产生错误,并且不会绑定到enum。如上所述,唯一的方法是将templatecode作为字符串发送:

templateCode: GENERIC

好的,这将满足您的需要,但是可能有更好的方法使所有枚举以这种方式呈现。在引导中,使用:

JSON.registerObjectMarshaller(TemplateCode) {
    return it.toString()
}
这将正确呈现EmailTemplate,如下所示:

{"templateCode":"CUSTOM"}

我认为这个问题是由于在呈现枚举时同时使用了枚举的名称和值造成的。呈现模板代码应该只是“通用”或“自定义”,正如您所指出的,应该很容易返回并转换回枚举。如果出于某些显示目的需要枚举的“值”,则应将其作为另一个字段(templateCodeValue)发送,或单独调用以检索枚举键到值的映射(例如,用于下拉)。感谢您的评论。问题不在于在渲染中使用名称和值,即使在上面编辑的简化版本中,Grails输入/输出JSON值也不一致。