Jackson Streaming API

1 . Überblick

In diesem Artikel werden wir uns die Jackson Streaming API ansehen. Es unterstützt sowohl das Lesen als auch das Schreiben. Mit dieser Funktion können wir leistungsstarke und schnelle JSON-Parser schreiben.

Auf der anderen Seite ist die Verwendung etwas schwierig - jedes Detail von JSON-Daten muss explizit im Code behandelt werden.

2. Maven-Abhängigkeit

Zunächst müssen wir dem Jackson-Core eine Maven-Abhängigkeit hinzufügen :

 com.fasterxml.jackson.core jackson-core 2.11.1 

3. Schreiben an JSON

Wir können JSON-Inhalte mithilfe einer JsonGenerator- Klasse direkt in den OutputStream schreiben . Zunächst müssen wir die Instanz dieses Objekts erstellen:

ByteArrayOutputStream stream = new ByteArrayOutputStream(); JsonFactory jfactory = new JsonFactory(); JsonGenerator jGenerator = jfactory .createGenerator(stream, JsonEncoding.UTF8);

Nehmen wir als nächstes an, wir möchten einen JSON mit der folgenden Struktur schreiben:

{ "name":"Tom", "age":25, "address":[ "Poland", "5th avenue" ] }

Wir können eine Instanz des JsonGenerator verwenden , um bestimmte Felder direkt in den OutputStream zu schreiben :

jGenerator.writeStartObject(); jGenerator.writeStringField("name", "Tom"); jGenerator.writeNumberField("age", 25); jGenerator.writeFieldName("address"); jGenerator.writeStartArray(); jGenerator.writeString("Poland"); jGenerator.writeString("5th avenue"); jGenerator.writeEndArray(); jGenerator.writeEndObject(); jGenerator.close();

Um zu überprüfen, ob der richtige JSON erstellt wurde, können wir ein String- Objekt mit einem JSON-Objekt erstellen :

String json = new String(stream.toByteArray(), "UTF-8"); assertEquals( json, "{\"name\":\"Tom\",\"age\":25,\"address\":[\"Poland\",\"5th avenue\"]}");

4. JSON analysieren

Wenn wir einen JSON- String als Eingabe erhalten und bestimmte Felder daraus extrahieren möchten, kann eine JsonParser- Klasse verwendet werden:

String json = "{\"name\":\"Tom\",\"age\":25,\"address\":[\"Poland\",\"5th avenue\"]}"; JsonFactory jfactory = new JsonFactory(); JsonParser jParser = jfactory.createParser(json); String parsedName = null; Integer parsedAge = null; List addresses = new LinkedList();

Wir möchten parsedName-, parsedAge- und Adressfelder von der Eingabe-JSON erhalten. Um dies zu erreichen, müssen wir die Parsing-Logik auf niedriger Ebene handhaben und selbst implementieren:

while (jParser.nextToken() != JsonToken.END_OBJECT) { String fieldname = jParser.getCurrentName(); if ("name".equals(fieldname)) { jParser.nextToken(); parsedName = jParser.getText(); } if ("age".equals(fieldname)) { jParser.nextToken(); parsedAge = jParser.getIntValue(); } if ("address".equals(fieldname)) { jParser.nextToken(); while (jParser.nextToken() != JsonToken.END_ARRAY) { addresses.add(jParser.getText()); } } } jParser.close();

Abhängig vom Feldnamen extrahieren wir ihn und weisen ihn einem geeigneten Feld zu. Nach dem Parsen des Dokuments sollten alle Felder korrekte Daten enthalten:

assertEquals(parsedName, "Tom"); assertEquals(parsedAge, (Integer) 25); assertEquals(addresses, Arrays.asList("Poland", "5th avenue"));

5. JSON-Teile extrahieren

Wenn wir ein JSON-Dokument analysieren, interessiert uns manchmal nur ein bestimmtes Feld.

In diesen Situationen möchten wir im Idealfall nur den Anfang des Dokuments analysieren. Sobald das erforderliche Feld gefunden wurde, können wir die Verarbeitung abbrechen.

Lassen Sie uns sagen , dass wir nur im Interesse sind Alter Bereich des Eingangs JSON. In diesem Fall können wir eine Parsing-Logik implementieren, um das Parsen zu stoppen, sobald das benötigte Feld gefunden wurde:

while (jParser.nextToken() != JsonToken.END_OBJECT) { String fieldname = jParser.getCurrentName(); if ("age".equals(fieldname)) { jParser.nextToken(); parsedAge = jParser.getIntValue(); return; } } jParser.close();

Nach der Verarbeitung hat das einzige parsedAge- Feld einen Wert:

assertNull(parsedName); assertEquals(parsedAge, (Integer) 25); assertTrue(addresses.isEmpty());

Dank dessen wird das Parsen des JSON-Dokuments viel schneller, da nicht das gesamte Dokument, sondern nur ein kleiner Teil davon gelesen werden muss.

6. Fazit

In diesem kurzen Artikel sehen wir uns an, wie wir die Stream Processing API von Jackson aus nutzen können.

Die Implementierung all dieser Beispiele und Codefragmente finden Sie auf GitHub - dies ist ein Maven-Projekt, daher sollte es einfach zu importieren und auszuführen sein.