JSON Serializer in Debugging Session verwenden

Welcher Java Entwickler kennt es nicht: Nach einigen konzentrierten Versuchen hat die Programmausführung endlich an exakt der richtigen Stelle angehalten. Alle Daten sind im kleinen Debugging Fenster erreichbar. Schade nur, das meine IDE keine Möglichkeit bietet, den riesigen Objektgraphen nach meinem relevanten Eintrag zu durchsuchen. Oder per EMail an die Fachabteilung zu verschicken.

Dabei ginge das sehr einfach: Mit einem auf reflection basierenden Objekt-Serialisierer. Dieser erzeugt ohne vorherige Konfiguration aus einem beliebig tiefen Objektgraphen einen String z.B. im JSON Format.

Und genau das kann während einer Debugging Session genutzt werden, wenn im Projekt ein Json Serializer eingebunden ist. Im „Evaluate“ Dialog oder unter „Watches“ wird der Serializer aufgerufen. Der entstandene String lässt sich dann leicht kopieren und weiter verarbeiten.

new flexjson.JSONSerializer() .prettyPrint(true).deepSerialize(myObjectGraph);

Als Framework um JSON zu erzeugen empfiehlt sich FlexJson. Dieses bietet für diesen Anwendungsfall Vorteile gegenüber dem zweiten Platzhirsch Jackson: Dank der Builder-API kann der Aufruf leicht parametrisiert werden und dennoch bleibt es ein Einzeiler. Im Beispiel oben wurde pretty-printing aktiviert. Einstellbar sind z.B. auch die Rekursionstiefe und Excludes. Die Darstellung von Java Collections erfolgt sehr übersichtlicher als Json-arrays.

Wer besser XML als Json lesen kann, erhält die gleiche Funktionalität mit Hilfe der XStream Bibliothek.

new XStream(new StaxDriver()).toXML(myObjectGraph);

Produktives Logging

Die Log-Ausgaben auf dem Produktivsystem sind of sehr kanpp, denn die toString() Methode ist nicht aussagekräftig überschrieben. Ein Rückschluss über den Systemzustand erhalte ich so nicht. Auch in diesem Fall kann die Situation verbessert werden. Einfach den als JSON serialisierten Objektgraphen loggen! Hier empfiehlt es sich, pretty printing auszuschalten um einzeilige Logausgaben zu erhalten.

Entwickler loggen manchmal bei wichtigen Ereignissen oder Zustandsübergängen eine Zusammenfassung der relevanten Informationen. Dieses erfolgt im Code oft durch (sehr) lange und schwer lesbare String.format Aufrufe. Die Lesbarkeit und Erweiterbarkeit kann einfach erhöht werden, wenn eine Map aus Beschreibung-Wert-Paaren erstellt und in JSON serialisiert wird:

Map pairs = new HashMap();
pairs.put("AngebotAnnahme", "durchgeführt");
pairs.put("AnnahmeStatus",getAnnahmeStatus());
pairs.put("Vorgang", teilVorgang.getVorgangId());
pairs.put("fuehreKostenpflichtigeDiensteAus", fuehreKostenpflichtigeDiensteAus);
LOG.info(jsonSerializer.toJson(pairs));

Fazit

Ein JSON Serialisierer hilft mir als Entwickler, sehr einfach und spontan einen Snapshot meines Systems zu erstellen. Beim Debuggen genauso wie im Produktivbetrieb.