Pretvorite XML u JSON pomoću Jacksona
1. Pregled
U ovom uputstvu vidjet ćemo kako pretvoriti XML poruku u JSON pomoću Jacksona.
Za čitatelje koji su tek upoznali Jacksona, razmislite o tome da se prvo upoznaju s osnovama.
2. Uvod u Jacksona
Možemo razmišljati o raščlanjivanju JSON-a na tri različita načina s Jacksonom:
- Prvo i najčešće je vezivanje podataka s ObjectMapper
- Druga je preslikavanje na strukturu podataka stabla s TreeTraversingParser i JsonNode
- I treće je strujanje strukture podataka stabla po tokenu, koristeći JsonParser i JsonGenerator
Sada Jackson također podržava prva dva za XML podatke. Kao takvi, pogledajmo kako nam Jackson može pomoći u pretvorbi iz jednog formata u drugi.
3. Ovisnosti
Prvo, moramo dodati jackson-databind ovisnost o našoj pom.xml:
com.fasterxml.jackson.core jackson-databind 2.11.1
Ova će nam knjižnica omogućiti upotrebu API-ja za vezanje podataka.
Drugi je jackson-dataformat-xml što dodaje Jacksonovu podršku za XML:
com.fasterxml.jackson.dataformat jackson-dataformat-xml 2.11.1
4. Vezanje podataka
Vezanje podataka, jednostavno rečeno, je kada želimo serizirane podatke izravno preslikati na Java objekt.
Da biste ovo istražili, definirajmo svoj XML s Cvijet i Boja Svojstva:
Mak CRVENI 9
Ovo je slično ovoj Java oznaci:
javna klasa Cvijet {naziv privatnog niza; privatna boja u boji; privatne Integer latice; // geteri i postavljači} public enum Boja {PINK, PLAVA, ŽUTA, CRVENA; }
Naš prvi korak bit će raščlanjivanje XML-a na Cvijet primjer. Da bismo to učinili, stvorimo instancu XmlMapper, Jacksonov XML ekvivalent za ObjectMapper i koristiti svoje readValue metoda:
XmlMapper xmlMapper = novi XmlMapper (); Cvjetni mak = xmlMapper.readValue (xml, Flower.class);
Jednom kad imamo svoje Cvijet primjerice, htjet ćemo ga zapisati kao JSON koristeći poznato ObjectMapper:
Mapa ObjectMapper = novi ObjectMapper (); Niz json = mapper.writeValueAsString (mak);
I, kao rezultat, dobivamo naš JSON ekvivalent:
{"name": "Mak", "color": "CRVENO", "latice": 9}
5. Prelazak stabla
Ponekad izravni pogled na strukturu stabla može pružiti veću fleksibilnost, kao u slučaju da ne želimo održavati posredničku klasu ili želimo pretvoriti samo dio strukture.
Iako, kao što ćemo vidjeti, dolazi s nekim kompromisima.
Prvi korak sličan je našem prvom koraku kada koristimo vezivanje podataka. No, ovaj put ćemo koristiti readTree metoda:
XmlMapper xmlMapper = novi XmlMapper (); JsonNode čvor = xmlMapper.readTree (xml.getBytes ());
Nakon što smo to učinili, imat ćemo JsonNode koja ima troje djece, kao što smo i očekivali: ime, boja, i latice.
Zatim, možemo ponovno koristiti ObjectMapper, samo šaljemo naše JsonNode umjesto toga:
ObjectMapper jsonMapper = novi ObjectMapper (); Niz json = jsonMapper.writeValueAsString (čvor);
Sada se ishod malo razlikuje u odnosu na naš posljednji primjer:
{"name": "Mak", "color": "CRVENO", "latice": "9"}
Nakon pažljivog pregleda možemo vidjeti da je atribut latica serializiran u niz umjesto u broj!Ovo je zbog readTree ne izvodi tip podataka bez izričite definicije.
5.1. Ograničenja
I, postoje određena ograničenja s Jackson-ovom podrškom za prelazak XML stabla:
- Jackson ne može razlikovati objekt i niz. Budući da XML-u nedostaju izvorne strukture da bi se objekt razlikovao od popisa objekata, Jackson će ponovljene elemente jednostavno porediti u jednu vrijednost.
- A budući da Jackson želi preslikati svaki XML element u JSON čvor, on ne podržava miješani sadržaj.
Iz tih razloga službeni Jackson dokumenti preporučuju ne korištenje modela Tree za raščlanjivanje XML-a.
6. Ograničenja memorije
Sad obje imaju značajnu manu da cijeli XML mora biti odjednom u memoriji da bi mogao izvršiti pretvorbu. Dok Jackson ne podrži strujanje strukture stabla kao žetone, ostat ćemo s ovim ograničenjem ili ćemo morati pogledati svoje vlastito valjanje s nečim poput XMLStreamReader.
7. Zaključak
U ovom smo uputstvu ukratko naučili različite načine na koje Jackson može čitati XML podatke i upisivati ih u JSON. Također, na brzinu smo pogledali ograničenja svakog podržanog pristupa.
Kao i obično, puni izvorni kod koji prati udžbenik dostupan je na GitHubu.