Jackson Streaming API

1. Áttekintés

Ebben a cikkben a Jackson Streaming API-t fogjuk megvizsgálni. Támogatja mind az olvasást, mind az írást, és használatával nagy teljesítményű és gyors JSON-elemzőket írhatunk.

A másik oldalon kissé nehéz használni - a JSON-adatok minden részletét kifejezetten kódban kell kezelni.

2. Maven-függőség

Először hozzá kell adnunk egy Maven-függőséget a jackson-core:

 com.fasterxml.jackson.core jackson-core 2.11.1 

3. Írás a JSON-hoz

Írhatunk JSON tartalmat közvetlenül a OutputStream az a használatával JsonGenerator osztály. Először létre kell hoznunk az objektum példányát:

ByteArrayOutputStream stream = new ByteArrayOutputStream (); JsonFactory jfactory = új JsonFactory (); JsonGenerator jGenerator = jfactory .createGenerator (adatfolyam, JsonEncoding.UTF8);

Ezután tegyük fel, hogy JSON-t akarunk írni a következő felépítéssel:

{"név": "Tom", "kor": 25, "cím": ["Lengyelország", "5. sugárút"]}

Használhatjuk a JsonGenerator hogy konkrét mezőket írjon közvetlenül a OutputStream:

jGenerator.writeStartObject (); jGenerator.writeStringField ("név", "Tom"); jGenerator.writeNumberField ("életkor", 25); jGenerator.writeFieldName ("cím"); jGenerator.writeStartArray (); jGenerator.writeString ("Lengyelország"); jGenerator.writeString ("5. sugárút"); jGenerator.writeEndArray (); jGenerator.writeEndObject (); jGenerator.close ();

Annak ellenőrzésére, hogy létrejött-e a megfelelő JSON, létrehozhatunk egy Húr objektum, benne JSON objektum:

String json = új karakterlánc (stream.toByteArray (), "UTF-8"); assertEquals (json, "{\" név \ ": \" Tom \ ", \" kor \ ": 25, \" cím \ ": [\" Lengyelország ", \" 5. sugárút \ "]}");

4. A JSON elemzése

Amikor JSON-t kapunk Húr bemenetként, és konkrét mezőket szeretnénk kivonni belőle, a JsonParser osztály használható:

Karakterlánc json = "{\" név \ ": \" Tom \ ", \" kor \ ": 25, \" cím \ ": [\" Lengyelország \ ", \" 5. sugárút \ "]}"; JsonFactory jfactory = új JsonFactory (); JsonParser jParser = jfactory.createParser (json); String parsedName = null; Egész szám parsedAge = null; Lista címek = new LinkedList ();

Meg akarjuk szerezni parsedName, parsedAge és címek mezők a JSON bemenetből. Ennek eléréséhez az alacsony szintű értelmezési logikát kell kezelnünk és magunknak kell megvalósítanunk:

while (jParser.nextToken ()! = JsonToken.END_OBJECT) {karakterlánc mezőnév = jParser.getCurrentName (); if ("név" .egyenlő (mezőnév)) {jParser.nextToken (); parsedName = jParser.getText (); } if ("kor" .egyenlő (mezőnév)) {jParser.nextToken (); parsedAge = jParser.getIntValue (); } if ("cím" .egyenlő (mezőnév)) {jParser.nextToken (); while (jParser.nextToken ()! = JsonToken.END_ARRAY) {címek.add (jParser.getText ()); }}} jParser.close ();

A mező nevétől függően kivonjuk és hozzárendeljük a megfelelő mezőhöz. A dokumentum elemzése után az összes mezőnek helyes adatokkal kell rendelkeznie:

assertEquals (parsedNév, "Tom"); assertEquals (parsedAge, (Egész) 25); assertEquals (címek, Arrays.asList ("Lengyelország", "5. sugárút"));

5. A JSON alkatrészek kinyerése

Néha, amikor JSON-dokumentumot elemzünk, csak egy adott terület érdekel minket.

Ideális esetben ezekben a helyzetekben csak a dokumentum elejét akarjuk értelmezni, és ha a szükséges mező megtalálható, megszakíthatjuk a feldolgozást.

Tegyük fel, hogy csak a kor a JSON bemenet mezője. Ebben az esetben értelmezési logikát valósíthatunk meg az elemzés leállításához, ha a szükséges mező megtalálható:

while (jParser.nextToken ()! = JsonToken.END_OBJECT) {Karakterlánc mezőnév = jParser.getCurrentName (); if ("kor" .egyenlő (mezőnév)) {jParser.nextToken (); parsedAge = jParser.getIntValue (); Visszatérés; }} jParser.close ();

Feldolgozás után az egyetlen parsedAge mező értéke:

assertNull (parsedNév); assertEquals (parsedAge, (Egész) 25); assertTrue (address.isEmpty ());

Ennek köszönhetően a JSON dokumentum elemzése sokkal gyorsabb lesz, mert nem a teljes dokumentumot kell elolvasnunk, hanem csak annak kis részét.

6. Következtetés

Ebben a rövid cikkben azt vizsgáljuk, hogyan tudjuk kihasználni a Stream Processing API-t Jacksonból.

Ezeknek a példáknak és kódrészleteknek a megvalósítása megtalálható a GitHub-on - ez egy Maven-projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.