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.