gpt4 book ai didi

grails - 从 JSON 绑定(bind)到 Grails 中的枚举

转载 作者:行者123 更新时间:2023-12-02 14:07:17 24 4
gpt4 key购买 nike

运行 Grails 2.4.2 我无法从 JSON 字符串中绑定(bind)枚举。我认为声明一个接受值的构造函数可以解决问题,但它没有。我还尝试使用名称传递 JSON:“GENERIC”,它也没有绑定(bind)。

如果值作为 STRING 提交,则可以绑定(bind)到 Enum。但这意味着改变 JSON 的枚举输入绑定(bind)与默认呈现的方式。例如,这有效:

{"id":null,"templateCode": "GENERIC"}

从 JSON 绑定(bind)枚举的正确/最佳方式是什么?
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 字符串会出错,并且不会绑定(bind)到枚举。如上所述,唯一的方法是将模板代码作为字符串发送:
templateCode: GENERIC

最佳答案

好吧,这会做你想做的事,但可能有更好的方法让所有枚举都以这种方式呈现。在 Bootstrap 中,使用:

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

这将正确呈现 EmailTemplate,如:
{"templateCode":"CUSTOM"}

关于grails - 从 JSON 绑定(bind)到 Grails 中的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26475723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com