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.