2014-10-20 50 views
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 
+0

我认为这个问题的结果,从您使用的名称和枚举的渲染它的价值。如您所指出的,渲染templateCode应该是“GENERIC”或“CUSTOM”,它们应该很容易返回并转换回枚举。如果您需要为某些显示目的而使用枚举的“值”,那么应该将其作为另一个字段(templateCodeValue)或独立调用将枚举键映射为值来检索(用于下拉, 例如)。 – billjamesdev 2014-10-20 23:46:14

+0

感谢您的意见条例草案。问题不在于在渲染中使用名称和值,即使在上面编辑的简化版本中,Grails输入/输出JSON值也不一致。 – Micor 2014-10-21 00:01:14

回答

0

那么,这会做你想做的,但可能有一个更好的办法,使所有枚举以这种方式呈现。在引导,使用:

JSON.registerObjectMarshaller(TemplateCode) { 
    return it.toString() 
} 

这将正确显示的emailTemplate这样的:

{"templateCode":"CUSTOM"}