1
运行Grails 2.4.2我无法从JSON字符串获取绑定的枚举。我认为声明一个具有价值的构造函数可以解决问题,但它没有。我也尝试传递名称为“GENERIC”的JSON,它也没有绑定。从JSON绑定到Grails中的枚举
如果将值作为STRING提交,则可以绑定到Enum。但这意味着如何改变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"}}
编辑:简体版
如果我们将用枚举在它的基础上,使:
个public enum TemplateCode {
GENERIC,CUSTOM
}
Grails将它渲染成JSON为:
templateCode: { enumType: com.EmailTemplateCode, name: GENERIC}
然而,张贴了同JSON字符串,会给出一个错误,而不是绑定到枚举。要做到这一点,如上面提到的唯一方法是通过发送templatecode作为字符串:
templateCode: GENERIC
我认为这个问题的结果,从您使用的名称和枚举的渲染它的价值。如您所指出的,渲染templateCode应该是“GENERIC”或“CUSTOM”,它们应该很容易返回并转换回枚举。如果您需要为某些显示目的而使用枚举的“值”,那么应该将其作为另一个字段(templateCodeValue)或独立调用将枚举键映射为值来检索(用于下拉, 例如)。 – billjamesdev 2014-10-20 23:46:14
感谢您的意见条例草案。问题不在于在渲染中使用名称和值,即使在上面编辑的简化版本中,Grails输入/输出JSON值也不一致。 – Micor 2014-10-21 00:01:14