Groovy bietet mit dem groovy.json.JsonBuilder und dem groovy.json.JsonBuilder sehr gute und einfache Möglichkeiten zur Json-Verarbeitung. Hier sollen einfache Groovy Beans (POGO's - Plain Old Groovy Objects) in Json Objekte und wieder zurück transformiert werden.
Dies ist ja dank Builder und Slurper kein Hexenwerk mehr. Das Beispiel-Bean ist folgendes (beliebig austauschbar):
Bean To Json
Nun ist folgender Aufruf möglich:
Um die Klassen eindeutig identifizieren zu können, wird hier als Json-Key auf oberster Ebene der Name der Klasse benutzt. Und nun der Weg zurück...
Json To Bean
Damit ist der Aufruf möglich:
Meta Programming
Jetzt können die beiden Funktionen noch an die Beispielklasse “angehängt“ werden. Dass kann zum Beispiel beim automatischen Anhängen an eine Reihe von Klassen interessant sein:
Die Methode “toBean“ wurde dabei statisch (an der Klasse) hinzugefügt.
Jetzt ist der Aufruf toJson() direkt an der Instanz und toBean(...) an der Klasse möglich:
Na dann viel Spaß beim “Bauen“ und “Schlürfen“.
Dies ist ja dank Builder und Slurper kein Hexenwerk mehr. Das Beispiel-Bean ist folgendes (beliebig austauschbar):
class Book { String title String author }
Bean To Json
String toJsonImpl(def bean) { JsonBuilder builder = new JsonBuilder() builder { // Hier folgen Schlüssel und Wert des Eintrags // dabei ist eine Variable als Schlüssel nicht möglich // deshalb "${ ... }" "${ bean.class.getName() }" bean } return builder.toString() }
Nun ist folgender Aufruf möglich:
assert '{"Book":{"title":"Die Entw...","author":"G.S."}}' == JsonUtil.toJsonImpl(new Book(title: "Die Entw...", author: "G.S."))
Um die Klassen eindeutig identifizieren zu können, wird hier als Json-Key auf oberster Ebene der Name der Klasse benutzt. Und nun der Weg zurück...
Json To Bean
def toBeanImpl(String json) { JsonSlurper slurper = new JsonSlurper() def beanData = slurper.parseText(json) String beanClassName Map beanParameter beanData.eachWithIndex { key, value, index -> if (index == 0) { beanClassName = key beanParameter = value } } def beanInstance = Class.forName(beanClassName) .newInstance(beanParameter) return beanInstance }
Damit ist der Aufruf möglich:
assert JsonUtil.toBeanImpl( '{"Book":{"title":"Die Entw...","author":"G.S."}}').properties == new Book(title: "Die Entw...", author: "G.S.").properties
Meta Programming
Jetzt können die beiden Funktionen noch an die Beispielklasse “angehängt“ werden. Dass kann zum Beispiel beim automatischen Anhängen an eine Reihe von Klassen interessant sein:
Book.metaClass.toJson = { return JsonUtil.toJsonImpl(delegate) } Book.metaClass.'static'.toBean = { String json -> return JsonUtil.toBeanImpl(json) }
Die Methode “toBean“ wurde dabei statisch (an der Klasse) hinzugefügt.
Jetzt ist der Aufruf toJson() direkt an der Instanz und toBean(...) an der Klasse möglich:
Book bookBean = new Book(title: "Groovy in Action", author: "Dierk Konig") String jsonBook = bookBean.toJson() Book bookBean2 = Book.toBean(jsonBook) assert bookBean.properties == bookBean2.properties
Na dann viel Spaß beim “Bauen“ und “Schlürfen“.