Jackson Streaming API

1. Prehľad

V tomto článku sa pozrieme na Jackson Streaming API. Podporuje čítanie aj písanie a jeho používaním dokážeme písať vysoko výkonné a rýchle analyzátory JSON.

Na druhej strane je to trochu ťažké použiť - s každým detailom údajov JSON je potrebné zaobchádzať explicitne v kóde.

2. Závislosť od Maven

Najskôr musíme do Maven pridať závislosť Maven jackson-core:

 com.fasterxml.jackson.core jackson-core 2.11.1 

3. Písanie do JSON

Môžeme písať obsah JSON priamo do OutputStream použitím a JsonGenerator trieda. Najprv musíme vytvoriť inštanciu tohto objektu:

Stream ByteArrayOutputStream = nový ByteArrayOutputStream (); JsonFactory jfactory = nový JsonFactory (); JsonGenerator jGenerator = jfactory .createGenerator (stream, JsonEncoding.UTF8);

Ďalej si povedzme, že chceme napísať JSON s nasledujúcou štruktúrou:

{"name": "Tom", "age": 25, "adresa": ["Poľsko", "5. avenue"]}

Môžeme použiť inštanciu JsonGenerator písať konkrétne polia priamo do Výstupný prúd:

jGenerator.writeStartObject (); jGenerator.writeStringField ("meno", "Tom"); jGenerator.writeNumberField ("vek", 25); jGenerator.writeFieldName ("adresa"); jGenerator.writeStartArray (); jGenerator.writeString ("Poľsko"); jGenerator.writeString ("5. avenue"); jGenerator.writeEndArray (); jGenerator.writeEndObject (); jGenerator.close ();

Aby sme skontrolovali, či bol vytvorený správny JSON, môžeme vytvoriť a String objekt s objektom JSON v ňom:

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

4. Analýza JSON

Keď dostaneme JSON String ako vstup a chceme z neho extrahovať konkrétne polia, a JsonParser trieda môže byť použitá:

Reťazec json = "{\" meno \ ": \" Tom \ ", \" vek \ ": 25, \" adresa \ ": [\" Poľsko \ ", \" 5. avenue \ "]}"; JsonFactory jfactory = nový JsonFactory (); JsonParser jParser = jfactory.createParser (json); Reťazec parsedName = null; Celé číslo parsedAge = null; Zoznam adries = new LinkedList ();

Chceme získať parsedName, parsedAge a adresy polia zo vstupu JSON. Aby sme to dosiahli, musíme zvládnuť logiku analýzy na nízkej úrovni a implementovať ju sami:

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

V závislosti od názvu poľa ho extrahujeme a priradíme k správnemu poľu. Po analýze dokumentu by všetky polia mali mať správne údaje:

assertEquals (parsedName, "Tom"); assertEquals (parsedAge, (Integer) 25); assertEquals (adresy, Arrays.asList ("Poľsko", "5. avenue"));

5. Extrahovanie častí JSON

Pri analýze dokumentu JSON nás niekedy zaujíma iba jedno konkrétne pole.

V ideálnom prípade by sme v týchto situáciách chceli analyzovať iba začiatok dokumentu a po nájdení potrebného poľa môžeme spracovanie prerušiť.

Povedzme, že nás zaujíma iba Vek pole vstupného JSON. V tomto prípade môžeme implementovať logiku syntaktickej analýzy na zastavenie syntaktickej analýzy, keď sa nájde potrebné pole:

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

Po spracovaní jediný parsedAge pole bude mať hodnotu:

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

Vďaka tomu bude analýza dokumentu JSON oveľa rýchlejšia, pretože nepotrebujeme prečítať celý dokument, ale iba jeho malú časť.

6. Záver

V tomto rýchlom článku sa zaoberáme tým, ako môžeme využiť Jackson Stream Processing API z Jacksona.

Implementáciu všetkých týchto príkladov a útržkov kódu nájdete na GitHub - jedná sa o projekt Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


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