Java EE 7: Web Services

Einlesen von JSON-Strukturen per Streaming-API

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Recht performantes Einlesen einer JSON-Struktur in einem Programm gelingt mit der Streaming-API. Diese arbeitet analog zu SAX oder StAX im XML-Umfeld und benötigt deshalb deutlich weniger Ressourcen, als beispielsweise die Model-API.

Transkript

Mit der Streaming-API stellt uns Json-P einen Ansatz bereit, mit dessen Hilfe wir Json-Strukturen verarbeiten können. Die Streaming-API verfolgt dabei ein Konzept, das dem von XML-Readern wie SAX oder StAX sehr ähnlich ist. In diesem Video werden wir uns mit der Streaming-API auseinandersetzen, uns darüber unterhalten, wie sie funktioniert und eine Json-Struktur mit hilfe der Streaming-API einlesen. Wie bereits erwähnt, verfolgt die Streaming-API einen ähnlichen Auslese-Ansatz wie es beispielsweise SAX oder StAX im XML-Umfeld machen. Dieser Ansatz läuft so, dass ein Objekt durchlaufen wird und zwar mit Hilfe einer Methode namens next() und damit werden für jeden Durchlauf Name-Wert-Paar Events zurückgegeben. Diese Events können dann ausgewertet werden und zwar wird dann in Abhängigkeit vom Event auf die Daten zugegriffen. Das eigentliche Lesen wird als Hilfe eines JsonParsers abgebildet. Dieser JsonParser ist die eigentliche Klasse, mit der wir arbeiten. Wir haben anders als beispielsweise bei der Modell-API mit weniger verschiedenen Klassen zu tun, sondern wir arbeiten wirklich nur mit einer JsonParser-Instanz. Diese JsonParser-Instanz wird mit Hilfe einer while-Schleife durchlaufen und dabei wird das Dokument von oben nach unten durchlaufen und verarbeitet. Das Abrufen der Werte geschieht dann mit Hilfe von Events. Diese Events informieren uns dann über Beginn und Ende von Arrays beispielsweise, oder Beginn und Ende von untergeordneten Objekten, sie geben uns Auskunft über den Namen von Feldern und wir erfahren, wenn wir auf Werte stoßen. Diese Werte können wir dann mit Hilfe von diversen get()-Methoden ansprechen und abrufen. Schauen wir uns nun an, wie wir das Ganze in Code umsetzen können. Hier in der Entwicklungsumgebung habe ich die einzulesende Json-Struktur geöffnet. Die befinden sich in einer Datei mit dem Namen movies.json und verfügt über drei Felder, nämlich die Felder "name", "actors" und "year". "name" beinhaltet eine Zeichenkette, "actors" ein Array von untergeordneten Zeichenketten und "year" eine Ganzzahl. Die wollen wir nun per Streamin-API einlesen. Zu diesem Zweck legen wir eine neue Java-Klasse an, die wir StreamingReader nennen. Wir setzen das Häkchen vor der Generierung des public static void main stubs. Nun können wir in dieser Klasse die entsprechenden Verarbeitungen vornehmen. Zunächst benötigen wir eine JsonParser-Instanz. Diese JsonParser-Instanz generieren wir über die Methode createParser Der erfordert die Eingabe einer FileInputStream-Instanz und die lassen wir auf die eben gezeigte Json-Struktur verweisen. Beim Einlesen kann es zu einer Exception kommen, deswegen fügen wir die throws declaration zur Methode hinzu. Nun müssen wir uns Gedanken darüber- machen, wie das Einlesen stattfindet. Es ist so, dass die Json-Struktur einfach durchlaufen wird und zwar von oben nach unten, von links nach rechts, von außen nach innen. Jedes Mal, wenn wir über einen Knoten kommen, wird uns eine entsprechende Information generiert und zwar in Form eines Events. Danach wird direkt weitergegangen und wenn wir nun das nächste Mal über einen Knoten kommen, dann benötigen wir möglicherweise die Information, ob wir gerade einen Schauspieler einlesen wollen, oder ob wir das Jahr einlesen wollen, oder ob wir den Namen des Filmes einlesen wollen, denn beim nächsten Schritt sind Infos nicht mehr verfügbar. Aus diesem Grund definieren wir uns drei Variablen, nämlich die Variable isReadingActors, die Variable isReadingYear und die Variable isReadingName, alle vom Typ boolean. Darüber hinaus wollen wir die eigentlichen Werte halten, dafür definieren wir einen StringBuilder für die Schauspieler, wir definieren einen String für den Namen des Films und einen Integer-Wert, um das Jahr zu erhalten. Nun können wir den Parser nutzen, um die Json-Struktur zu durchlaufen. Das machen wir in Form einer while()-Schleife, indem wir die Methode hasNext() aufrufen und die gibt uns solange boolean true zurück, wie wir tatsächlich noch Knoten im Dokument haben. Jetzt holen wir uns die Information über eine javax.json.stream.JsonParser.Event-Instanz was wir denn im Moment beim Parser behandeln lassen und zwar über die Methode next() des Parsers. Diesen Event können wir nutzen, um unsere Logik zu implementieren. Sollten wir auf Werte kommen, FALSE oder TRUE oder ZAHLEN oder ZEICHENKETTEN, dann können wir die Werte einlesen und zwar werden wir dafür unsere weiter oben generierten boolschen Flags aus. Wenn wir die Schauspieler einlesen, dann fügen wir den aktuellen Wert, den wir über parser.getString erhalten können, dem stringBuilder hinzu und sorgen für einen Zeilenumbruch. Sollten wir das Jahr einlesen, dann holen wir uns den aktuellen Wert über die Methode getInt des Parsers, und sollten wir gerade den Namen einlesen, dann holen wir uns den Namen wieder über die Methode getString des Parsers. In jedem Fall sobald wir eine dieser Varianten durchlaufen haben, können wir die Flags für isReadingName und isReadingYear schon mal auf false setzen. Ein weiterer Eventtyp, der auftreten kann, ist das Event START_ARRAY. Da wir nun ein Array haben, können wir hier das boolsche Flag isReadingActors Beim Even END_ARRAY setzen wir es auf false. Das heißt, beim Beginn des Einlesens wird es auf true gesetzt, dann kann hier oben beim nächsten Auftreten der Zeichenkette der Schauspieler entsprechend eingelesen werden und am Ende des Arrays wird es auf false gesetzt, dann wird der nächste Wert nicht mehr als Wert dieses Arrays aufgefasst. Zuletzt müssen wir noch für die Fälle, dass wir auf die Felder name oder year kommen eine entsprechende Abfrage machen und das können wir auf Ebene des KEY_NAME Events machen. Da rufen wir uns den Namen des aktuellen Feldes über getString ab und werten den nun aus. Wenn der name year entspricht, dann lesen wir im nächsten Schritt den Jahreswert ein, entspricht er dem Wert name, dann wird als nächstes der Name des Films eingelesen. Damit ist das Einlesen der Daten abgeschlossen. Wir können dann die eingelesenen Daten, nachdem die while()-Schlaufe durchlaufen ist und das Einlesen der Struktur abgeschlossen ist, ausgeben. Das machen wir, indem wir auf unsere Felder zugreifen. Jetzt geben wir die Schauspieler aus. Und zuletzt geben wir das "JAHR" aus und damit ist die Verarbeitung abgeschlossen. Nun können wir das Beispiel einmal laufen lassen und werden die entsprechende Ausgabe erhalten. Der Filmname, die Schauspieler und das Jahr sind alle geladen worden. Sie sehen, es ist mit Hilfe der Streaming-API ebenfalls möglich, Strukturen einzulesen, allerdings ist die Streaming-API nicht unbedingt bezogen auf Programmierkonventionen, eleganteste Einsatz. Sondern hier schreibt man sehr schnell Spaghetti-Code. Der große Vorteil der Streaming- API ist, dass hier ein deutlicher Geschwindigkeitsunterschied, in Bezug auf beispielsweise der Modell-API, herrscht, denn hier wird nicht zuerst ein Objektmodell aufgebaut, das uns dann zur Verfügung gestellt wird, sondern hier wird die Struktur genau in der Reihenfolge, in der sie auch im Speicher liegt, durchlaufen und bei jedem Element, das man antrifft, erhalten wir dann schon direkt die Informationen darüber. Das heißt, wir arbeiten wesentlich dichter an der Struktur dran und müssen dann allerdings auch wesentlich mehr Logik implementieren, um auf diesem eventbasierten Ansatz, die richtigen Entscheidungen zu treffen und an die richtigen Informationen heranzukommen. Welche Varianten Sie benutzen, ob die Modell-API oder Streaming-API ist letztlich Ihre persönliche Angelegenheit, wenn es um Performance geht, wird es allerdings nichts Besseres geben, als die Streaming-API. In diesem Video haben wir uns mit dem Einsatz der Streaming-API auseinandergesetzt und wir haben geklärt, wie wir mit ihrer Hilfe Daten einlesen können, welche Schritte wir dabei gehen müssen und dann auch an die entsprechend richtigen Informationen herankommen können. Wir haben uns das Eventmodell angeschaut und wir haben besprochen, ob und an welcher Stelle die Streaming-API gegenüber der Modell- API Vorteile bringt.

Java EE 7: Web Services

Steigen Sie ein in die Java-Enterprise-Welt und lernen Sie, wie Nachrichten ausgetauscht und Dienste definiert werden.

5 Std. 13 min (30 Videos)
Derzeit sind keine Feedbacks vorhanden...

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!