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.