Jackson Streaming API

1. Oversigt

I denne artikel vil vi se på Jackson Streaming API. Det understøtter både læsning og skrivning, og ved at bruge det kan vi skrive højtydende og hurtige JSON-parsere.

På bagsiden er det lidt vanskeligt at bruge - alle detaljer i JSON-data skal håndteres eksplicit i kode.

2. Maven-afhængighed

For det første skal vi tilføje en Maven-afhængighed til jackson-core:

 com.fasterxml.jackson.core jackson-core 2.11.1 

3. Skrivning til JSON

Vi kan skrive JSON-indhold direkte til OutputStream ved hjælp af en JsonGenerator klasse. For det første skal vi oprette forekomsten af ​​det objekt:

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

Lad os derefter sige, at vi vil skrive en JSON med følgende struktur:

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

Vi kan bruge en forekomst af JsonGenerator at skrive specifikke felter direkte til OutputStream:

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

For at kontrollere, om korrekt JSON blev oprettet, kan vi oprette en Snor objekt med JSON-objekt i det:

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

4. Analyse af JSON

Når vi får en JSON Snor som input, og vi ønsker at udtrække specifikke felter fra det, a JsonParser klasse kan bruges:

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

Vi ønsker at opnå parsedName, parsedAge og adresser felter fra input JSON. For at opnå dette er vi nødt til at håndtere parselogik på lavt niveau og selv implementere den:

mens (jParser.nextToken ()! = JsonToken.END_OBJECT) {String fieldname = jParser.getCurrentName (); hvis ("navn" .equals (feltnavn)) {jParser.nextToken (); parsedName = jParser.getText (); } if ("age" .equals (fieldname)) {jParser.nextToken (); parsedAge = jParser.getIntValue (); } hvis ("adresse" .equals (feltnavn)) {jParser.nextToken (); mens (jParser.nextToken ()! = JsonToken.END_ARRAY) {adresser.add (jParser.getText ()); }}} jParser.close ();

Afhængigt af feltnavnet udtrækker vi det og tildeler et korrekt felt. Efter analyse af dokumentet skal alle felter have korrekte data:

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

5. Udpakning af JSON-dele

Nogle gange, når vi analyserer et JSON-dokument, er vi kun interesseret i et bestemt felt.

I disse situationer vil vi ideelt set kun analysere begyndelsen af ​​dokumentet, og når det nødvendige felt er fundet, kan vi afbryde behandlingen.

Lad os sige, at vi kun er interesserede i alder felt for input JSON. I dette tilfælde kan vi implementere parselogik for at stoppe parsing, når det nødvendige felt er fundet:

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

Efter behandling er den eneste parsedAge felt vil have en værdi:

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

Takket være det vil parsing af JSON-dokumentet være meget hurtigere, fordi vi ikke behøver at læse hele dokumentet, men kun en lille del af det.

6. Konklusion

I denne hurtige artikel ser vi på, hvordan vi kan udnytte Stream Processing API ud af Jackson.

Implementeringen af ​​alle disse eksempler og kodestykker kan findes på GitHub - dette er et Maven-projekt, så det skal være let at importere og køre som det er.


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