API for streaming av Jackson

1. Oversikt

I denne artikkelen vil vi se på Jackson Streaming API. Den støtter både lesing og skriving, og ved å bruke den kan vi skrive høy ytelse og raske JSON-parsere.

På baksiden er det litt vanskelig å bruke - hver detalj av JSON-data må håndteres eksplisitt i kode.

2. Maven avhengighet

For det første må vi legge til en Maven-avhengighet til jackson-core:

 com.fasterxml.jackson.core jackson-core 2.11.1 

3. Skrive til JSON

Vi kan skrive JSON-innhold direkte til OutputStream ved å bruke en JsonGenerator klasse. For det første må vi lage forekomsten av det objektet:

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

La oss si at vi vil skrive en JSON med følgende struktur:

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

Vi kan bruke en forekomst av JsonGenerator for å skrive spesifikke felt direkte til OutputStream:

jGenerator.writeStartObject (); jGenerator.writeStringField ("navn", "Tom"); jGenerator.writeNumberField ("alder", 25); jGenerator.writeFieldName ("adresse"); jGenerator.writeStartArray (); jGenerator.writeString ("Polen"); jGenerator.writeString ("5. aveny"); jGenerator.writeEndArray (); jGenerator.writeEndObject (); jGenerator.close ();

For å sjekke om riktig JSON ble opprettet, kan vi opprette en String objekt med JSON-objekt i:

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

4. Analyse av JSON

Når vi får en JSON String som input, og vi ønsker å trekke ut spesifikke felt fra det, a JsonParser klasse kan brukes:

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

Vi ønsker å skaffe oss parsedName, parsedAge og adresser felt fra inngang JSON. For å oppnå dette, trenger vi å håndtere lav-nivå analyseringslogikk og implementere den selv:

mens (jParser.nextToken ()! = JsonToken.END_OBJECT) {String feltnavn = 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 (); mens (jParser.nextToken ()! = JsonToken.END_ARRAY) {adresser.add (jParser.getText ()); }}} jParser.close ();

Avhengig av feltnavnet trekker vi ut det og tilordner et riktig felt. Etter å ha analysert dokumentet, skal alle felt ha riktige data:

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

5. Pakke ut JSON-deler

Noen ganger, når vi analyserer et JSON-dokument, er vi bare interessert i ett bestemt felt.

I disse situasjonene vil vi ideelt sett bare analysere begynnelsen av dokumentet, og når det nødvendige feltet er funnet, kan vi avbryte behandlingen.

La oss si at vi bare er interessert i alder feltet til inngangen JSON. I dette tilfellet kan vi implementere parselogikk for å stoppe parsing når nødvendig felt er funnet:

mens (jParser.nextToken ()! = JsonToken.END_OBJECT) {String feltnavn = jParser.getCurrentName (); if ("age" .equals (fieldname)) {jParser.nextToken (); parsedAge = jParser.getIntValue (); komme tilbake; }} jParser.close ();

Etter behandling, den eneste analysert Alder feltet vil ha en verdi:

assertNull (parsedName); assertEquals (parsedAge, (Integer) 25); assertTrue (adresser. er tom ());

Takket være det vil analysering av JSON-dokumentet bli mye raskere fordi vi ikke trenger å lese hele dokumentet, men bare en liten del av det.

6. Konklusjon

I denne raske artikkelen ser vi på hvordan vi kan utnytte Stream Processing API ut av Jackson.

Implementeringen av alle disse eksemplene og kodebitene finner du på GitHub - dette er et Maven-prosjekt, så det skal være enkelt å importere og kjøre som det er.


$config[zx-auto] not found$config[zx-overlay] not found