2014-10-20 98 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"}