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