2013-02-22 9 views
5

Ich möchte die Art ändern, in der Enums zu JSON gemarshallt werden. Ich bin derzeit Standard grails.converters.JSON mit (als JSON) und zum Beispiel in der Steuerung verwende ich:Grails Enumeration zu JSON

FilmKind.values ​​() als JSON

Der Ausgang dieses ist:

"kind":[{"enumType":"FilmKind","name":"DRAMA"},{"enumType":"FilmKind","name":"ACTION"}] 

ich möchte "enumType" entfernen und nur zurückgeben:

"kind":["DRAMA","ACTION"] 

ich bin Suche nach einer Lösung, die mir noch erlauben würde

als JSON

weil ich individuell auf marshall jede Aufzählung nicht wollen, zu verwenden.

Antwort

10

weil ich individuell jede Aufzählung marshall nicht wollen.

Nun, es sei denn, Sie möchten Ihren eigenen JSON-Konverter schreiben, Marshalling ist der beste Ansatz hier. Der Grund ist, weil der einzige wirkliche Weg ist, zu tun, was Sergio vorschlägt, und Sie müssen den Code überall dort anrufen, wo Sie ihn brauchen. Und wenn FilmKind eine Eigenschaft einer anderen Klasse ist, wird seine Lösung überhaupt nicht funktionieren.

Ich würde vorschlagen Marshallers und hier ist, wie ich es tun würde. Erstellen Sie eine Klasse namens FilmKindMarsaller:

class FilmKindMarshaller { 
    void register() { 
    JSON.registerObjectMarshaller(FilmKind) { FilmKind filmKind -> 
     [ 
      name: filmKind.toString() 

     ] 
    } 
    } 
} 

Dann folgendes zu Ihrem Bootstrap hinzufügen:

[ new FilmKindMarshaller() ].each { it.register() } 

oben Das ist so, dass Sie nur Instanzen jeder Marshaller zu halten Hinzufügen Sie benötigen.

Jetzt, wo FilmKind JSON'ified ist, sei es allein oder Teil einer Elternklasse, erhalten Sie die gewünschte JSON, sans enumType.

1

Wie wäre:

def display = [kind:[]] 
FilmKind.values().each { val -> 
    display.kind.add(val.value) 
} 

render display as JSON 
+0

Dank! Das ist gut, ich musste es nur ein wenig anpassen, statt val.name muss val.value verwendet werden. Aber ich möchte immer noch eine Lösung, die dies auf einer niedrigeren Ebene tut, also muss ich sie nicht überall schreiben. Das Problem ist auch, wenn ich 'als JSON' für ein Domain-Objekt verwende, das eine Eigenschaft vom Enum-Typ enthält, wird der zugewiesene Enum-Wert immer noch mit 'enumType' gesendet. – MBozic

+0

Für eine niedrigere Ebene überprüfen Sie die Antwort von Gregg. –

2

Sie ein benutzerdefiniertes Objekt Einweiser für Ihre Domain Klasse as JSON zu ermöglichen registrieren. In Ihrem Bootstrap.groovy, können Sie etwas tun:

JSON.registerObjectMarshaller(FilmKind) { 
    def result = [:] 
    def props = ['name'] 
    props.each { prop -> 
     result[prop] = it."$prop" 
    } 
    result 
} 
13

Falls jemand wandert, wie alle Enum-Werte in einfachen String-Werte in allgemeiner Weise konvertieren:

für die Antwort
class EnumTypeHidingJSONMarshaller { 
    void register() { 
     JSON.registerObjectMarshaller(Enum) { Enum someEnum -> 
      someEnum.toString() 
     } 
    } 
} 
+5

Oder kürzer: JSON.registerObjectMarshaller (Enum, {Enum e -> e.name()}) –

+0

Funktioniert das für Grails3? – bitsnaps