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.