Jackson Streaming API

1. Pregled

U ovom ćemo članku razmotriti Jackson Streaming API. Podržava i čitanje i pisanje, a pomoću njega možemo pisati JSON parsere visokih performansi i brze.

S druge strane, pomalo je teško koristiti - svaki detalj JSON podataka mora se eksplicitno obrađivati ​​u kodu.

2. Ovisnost Mavena

Prvo, moramo dodati Mavenovu ovisnost na jackson-core:

 com.fasterxml.jackson.core jackson-core 2.11.1 

3. Pisanje u JSON

Sadržaj JSON možemo pisati izravno na Izlazni tok pomoću a JsonGenerator razred. Prvo, moramo stvoriti instancu tog objekta:

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

Dalje, recimo da želimo napisati JSON sa sljedećom strukturom:

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

Možemo upotrijebiti primjerak JsonGenerator za pisanje određenih polja izravno u Izlazni tok:

jGenerator.writeStartObject (); jGenerator.writeStringField ("ime", "Tom"); jGenerator.writeNumberField ("dob", 25); jGenerator.writeFieldName ("adresa"); jGenerator.writeStartArray (); jGenerator.writeString ("Poljska"); jGenerator.writeString ("5. avenija"); jGenerator.writeEndArray (); jGenerator.writeEndObject (); jGenerator.close ();

Da bismo provjerili je li stvoren odgovarajući JSON, možemo stvoriti Niz objekt s JSON objektom u sebi:

Niz json = novi String (stream.toByteArray (), "UTF-8"); assertEquals (json, "{\" ime \ ": \" Tom \ ", \" dob \ ": 25, \" adresa \ ": [\" Poljska \ ", \" 5. avenija \ "]}"));

4. Raščlanjivanje JSON-a

Kad dobijemo JSON Niz kao ulaz i iz njega želimo izvući određena polja, a JsonParser klasa se može koristiti:

Niz json = "{\" name \ ": \" Tom \ ", \" dob \ ": 25, \" adresa \ ": [\" Poljska \ ", \" 5. avenija \ "]}"; JsonFactory jfactory = novi JsonFactory (); JsonParser jParser = jfactory.createParser (json); Niz parsedName = null; Cijeli broj parsedAge = null; Adrese popisa = novi LinkedList ();

Želimo dobiti parsedName, parsedAge i adrese polja iz unosa JSON. Da bismo to postigli, moramo se nositi s logikom raščlanjivanja na niskoj razini i primijeniti je sami:

while (jParser.nextToken ()! = JsonToken.END_OBJECT) {Naziv polja niza = jParser.getCurrentName (); if ("name" .equals (ime polja)) {jParser.nextToken (); parsedName = jParser.getText (); } if ("age" .equals (ime polja)) {jParser.nextToken (); parsedAge = jParser.getIntValue (); } if ("adresa" .equals (ime polja)) {jParser.nextToken (); while (jParser.nextToken ()! = JsonToken.END_ARRAY) {adrese.add (jParser.getText ()); }}} jParser.close ();

Ovisno o nazivu polja, izdvajamo ga i dodjeljujemo odgovarajućem polju. Nakon raščlanjivanja dokumenta, sva bi polja trebala imati ispravne podatke:

assertEquals (parsedName, "Tom"); assertEquals (parsedAge, (Integer) 25); assertEquals (adrese, Arrays.asList ("Poljska", "5. avenija"));

5. Izdvajanje JSON dijelova

Ponekad, kada raščlanjujemo JSON dokument, zanima nas samo jedno određeno polje.

U idealnom slučaju, u tim situacijama želimo raščlaniti samo početak dokumenta, a kad se pronađe potrebno polje, možemo prekinuti obradu.

Recimo da nas zanima samo dob polje ulaznog JSON-a. U ovom slučaju možemo implementirati logiku raščlanjivanja kako bismo zaustavili raščlanjivanje kad se pronađe potrebno polje:

while (jParser.nextToken ()! = JsonToken.END_OBJECT) {Naziv polja niza = jParser.getCurrentName (); if ("age" .equals (ime polja)) {jParser.nextToken (); parsedAge = jParser.getIntValue (); povratak; }} jParser.close ();

Nakon obrade, jedini raščlanjenoAge polje će imati vrijednost:

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

Zahvaljujući tome, raščlanjivanje JSON dokumenta bit će puno brže jer ne trebamo čitati cijeli dokument već samo njegov mali dio.

6. Zaključak

U ovom kratkom članku gledamo kako možemo iskoristiti API za obradu struje iz Jacksona.

Provedbu svih ovih primjera i isječaka koda možete pronaći na GitHubu - ovo je Maven projekt, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.


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