Einfache JSON Integration in Java ohne JAXB mit Manifold

Im letzten Artikel hatten wir bereits eine Übersicht über die wichtigsten Funktionen von Manifold geliefert. In diesem Artikel der Serie soll es nun um die Möglichkeiten für die Integration von JSON-Objekten und JSON-Schemata direkt in den Java-Code gehen.

Man stelle sich vor, man hätte ein einfaches Entwicklungsprojekt mit einem Java-Backend und einem HTML/CSS/Plain-JavaScript-Frontend. Backend und Frontend werden von unterschiedlichen Teams entwickelt. Die Kommunikation soll über JSON ablaufen. Damit die Data Transfer Objects im Java Backend zu denen im Frontend passen, hat man sich darauf geeinigt, diese als JSON-Schema zentral zu definieren.

Da bei einem größeren Projekt schnell recht viele Transferobjekte zusammen kommen, möchte man die Java-Schnittstellen, welche diese Objekte mappen, üblicherweise nicht von Hand schreiben. Insbesondere, wenn sich die Objekte im späteren Verlauf ändern, macht es sehr viel Arbeit, den entsprechenden Codestand im Frontend und Backend synchron mit dem JSON-Schema zu halten.

Dieser Integrationstask ist längst gelöst und lässt sich daher in Java mit begrenztem Aufwand realisieren. So könnte man beispielsweise mit JAXB zu den JSON-Schemata passende Java-Objekte generieren.

Diese automatische Code-Generierung bringt allerdings ihre eigenen Probleme mit sich, etwa dass die IDE-Integration nicht immer problemlos verläuft und am Ende manchmal doch noch veraltete Versionen einiger Java-Objekte in einigen Caches verbleiben, etc. Außerdem hat man den zusätzlichen Code-Generation-Schritt nach jedem Synchronisieren der Workspaces, welcher die Buildzeit und damit die Iterationszeit insbesondere bei großen Projekten merklich beeinträchtigt.

Angenommen wir hätten folgendes beispielhafte JSON-Objekt User.json zu übertragen:

{
  "UserName": "ExampleUser",
  "EmailAddress": "user@example.org",
  "UserID": 0,
  "HashedPassword": "xxx"
}

Wäre es nicht schön, wenn man jetzt einfach das Folgende schreiben könnte, ohne irgendwelche Java-Klassen zu erstellen:

User u  = User.create();
u.setUserName("Steffen");
u.setEmailAddress("steffen.jacobs@example.org");
u.setUserID(1);
u.setHashedPassword("xXxXxX");

Genau das geht mit Manifold. Dazu muss man einfach nur das obere JSON im resources-Ordner des Java-Projektes ablegen, und schon lässt sich der obige Code kompilieren und ausführen. Alternativ zu dem JSON-Objekt kann man auch ein JSON-Schema in die Datei im resources-Ordner legen. Dabei wird aus dem JSON-Objekt im Hintergrund vom Compiler während der Buildphase ein Java-Objekt erzeugt, welches allerdings nicht als .java-Datei auf der Festplatte persistiert wird und somit keine Probleme mit der IDE oder dem Compiler erzeugt.

Im nächsten Schritt kann man dieses User-Objekt zu einem JSON-String oder auch zu einem XML-String machen:

System.out.println(u.toJson());
System.out.println(u.toXml());

Das Resultat:

{
  "UserName": "Steffen",
  "UserID": 1,
  "HashedPassword": "xXxXxX",
  "EmailAddress": "steffen.jacobs@example.org"
}
Short URL for this post: https://wp.me/p4nxik-3l9
Steffen Jacobs

About Steffen Jacobs

Java Consultant & Developer at Orientation in Objects GmbH. Follow me on Twitter and find me on LinkedIn and Xing. Some of the source code associated with the blog articles can be found on GitHub.
This entry was posted in Java and Quality and tagged , , , . Bookmark the permalink.

Leave a Reply