Jackson Streaming API

1 . Panoramica

In questo articolo, esamineremo l'API Jackson Streaming. Supporta sia la lettura che la scrittura e, utilizzandolo, possiamo scrivere parser JSON veloci e ad alte prestazioni.

Il rovescio della medaglia, è un po 'difficile da usare: ogni dettaglio dei dati JSON deve essere gestito in modo esplicito nel codice.

2. Dipendenza da Maven

Per prima cosa, dobbiamo aggiungere una dipendenza Maven al jackson-core :

 com.fasterxml.jackson.core jackson-core 2.11.1 

3. Scrittura su JSON

Possiamo scrivere contenuto JSON direttamente in OutputStream utilizzando una classe JsonGenerator . Innanzitutto, dobbiamo creare l'istanza di quell'oggetto:

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

Quindi, supponiamo di voler scrivere un JSON con la seguente struttura:

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

Possiamo usare un'istanza di JsonGenerator per scrivere campi specifici direttamente in OutputStream:

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();

Per verificare se è stato creato un JSON corretto, possiamo creare un oggetto String con un oggetto JSON al suo interno:

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

4. Analisi JSON

Quando otteniamo una stringa JSON come input e vogliamo estrarne campi specifici, è possibile utilizzare una classe JsonParser :

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();

Vogliamo ottenere i campi parsedName, parsedAge e address dall'input JSON. Per ottenere ciò, dobbiamo gestire la logica di analisi di basso livello e implementarla noi stessi:

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();

A seconda del nome del campo, lo stiamo estraendo e assegnando a un campo appropriato. Dopo aver analizzato il documento, tutti i campi dovrebbero avere dati corretti:

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

5. Estrazione di parti JSON

A volte, quando analizziamo un documento JSON, siamo interessati a un solo campo particolare.

Idealmente, in queste situazioni, si desidera analizzare solo l'inizio del documento e, una volta trovato il campo necessario, è possibile interrompere l'elaborazione.

Diciamo che siamo interessati solo al campo età del JSON di input. In questo caso, possiamo implementare la logica di parsing per interrompere l'analisi una volta trovato il campo necessario:

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

Dopo l'elaborazione, l'unico campo parsedAge avrà un valore:

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

Grazie a ciò, l'analisi del documento JSON sarà molto più veloce perché non abbiamo bisogno di leggere l'intero documento ma solo una piccola parte di esso.

6. Conclusione

In questo rapido articolo, stiamo esaminando come sfruttare l'API di elaborazione in streaming da Jackson.

L'implementazione di tutti questi esempi e frammenti di codice può essere trovata su GitHub: questo è un progetto Maven, quindi dovrebbe essere facile da importare ed eseguire così com'è.