Preveďte XML na JSON pomocou Jacksona
1. Prehľad
V tomto tutoriáli sa dozvieme, ako prevádzať správu XML na JSON pomocou Jacksona.
Pre čitateľov, ktorí sú v Jacksone noví, zvážte najskôr oboznámenie sa so základmi.
2. Úvod do Jacksona
Môžeme uvažovať o analýze JSON tromi rôznymi spôsobmi s Jacksonom:
- Prvá a najbežnejšia je väzba údajov s ObjectMapper
- Druhým je mapovanie na stromovú dátovú štruktúru pomocou TreeTraversingParser a JsonNode
- A tretím je streamovanie stromovej dátovej štruktúry pomocou tokenov pomocou JsonParser a JsonGenerator
Jackson teraz podporuje aj prvé dva pre údaje XML. Pozrime sa teda, ako nám Jackson môže pomôcť pri konverzii z jedného formátu do druhého.
3. Závislosti
Najprv musíme pridať jackson-databind závislosť na našom pom.xml:
com.fasterxml.jackson.core jackson-databind 2.11.1
Táto knižnica nám umožní používať API viazania údajov.
Druhá je jackson-dataformat-xml ktorý pridáva Jacksonovu podporu XML:
com.fasterxml.jackson.dataformat jackson-dataformat-xml 2.11.1
4. Väzba údajov
Zjednodušene povedané, dátová väzba je, keď chceme mapovať serializované údaje priamo na objekt Java.
Ak to chcete preskúmať, definujme náš XML pomocou Kvetina a Farba vlastnosti:
Mak RED 9
Toto je podobné tejto notácii Java:
verejná trieda Kvet {súkromné meno reťazca; súkromná farebná farba; súkromné celočíselné lístky; // getre a setre} verejné výpisy Farba {RUŽOVÁ, MODRÁ, ŽLTÁ, ČERVENÁ; }
Naším prvým krokom bude parsovanie XML na a Kvetina inštancia. Aby sme to dosiahli, vytvorme inštanciu XmlMapper, Jacksonov ekvivalent XML pre ObjectMapper a používať jeho readValue metóda:
XmlMapper xmlMapper = nový XmlMapper (); Kvetinový mak = xmlMapper.readValue (xml, Flower.class);
Keď už máme svoje Kvetina napríklad ho budeme chcieť zapísať ako JSON pomocou známeho ObjectMapper:
ObjectMapper mapovač = nový ObjectMapper (); Reťazec json = mapper.writeValueAsString (mak);
A ako výsledok dostaneme náš ekvivalent JSON:
{"name": "Poppy", "color": "RED", "petals": 9}
5. Traverz stromu
Pohľad priamo na stromovú štruktúru môže niekedy ponúknuť väčšiu flexibilitu, napríklad v prípade, že nechceme udržiavať sprostredkovateľskú triedu alebo chceme previesť iba časť štruktúry.
Ako však uvidíme, prichádza s určitými kompromismi.
Prvý krok je podobný nášmu prvému kroku, keď používame väzbu údajov. Tentokrát však použijeme readTree metóda:
XmlMapper xmlMapper = nový XmlMapper (); Uzol JsonNode = xmlMapper.readTree (xml.getBytes ());
Keď to urobíme, budeme mať JsonNode ktorá má 3 deti, ako sme očakávali: meno, farba, a okvetné lístky.
Potom môžeme opäť použiť ObjectMapper, stačí poslať náš JsonNode namiesto toho:
ObjectMapper jsonMapper = nový ObjectMapper (); Reťazec json = jsonMapper.writeValueAsString (uzol);
Výsledok sa teraz v porovnaní s našim posledným príkladom mierne líši:
{"name": "Poppy", "color": "RED", "petals": "9"}
Po dôkladnej kontrole vidíme, že atribút petals je serializovaný do reťazca namiesto čísla!To je preto, že readTree neodvodzuje údajový typ bez výslovnej definície.
5.1. Obmedzenia
S Jacksonovou podporou prechodu stromom XML existujú určité obmedzenia:
- Jackson nemôže rozlišovať medzi objektom a poľom. Pretože XML nemá natívne štruktúry na odlíšenie objektu od zoznamu objektov, Jackson jednoducho spojí opakované prvky do jednej hodnoty.
- A keďže Jackson chce mapovať každý prvok XML na uzol JSON, nepodporuje zmiešaný obsah.
Z týchto dôvodov odporúčajú oficiálne dokumenty Jacksona nepoužívať na analýzu XML modely Tree.
6. Pamäťové obmedzenia
Teraz majú obaja pozoruhodnú nevýhodu, že na uskutočnenie prevodu musí byť v pamäti naraz celý XML. Kým Jackson nepodporuje streamovanie stromovej štruktúry ako tokeny, zostaneme s týmto obmedzením alebo sa budeme musieť pozrieť na to, ako vytvoriť vlastnú pomocou niečoho ako XMLStreamReader.
7. Záver
V tomto tutoriáli sme sa stručne naučili rôzne spôsoby, ako môže Jackson čítať údaje XML a zapisovať ich do formátu JSON. Tiež sme sa rýchlo pozreli na obmedzenia každého podporovaného prístupu.
Celý zdrojový kód, ktorý je sprievodcom výukovým programom, je ako obvykle k dispozícii na GitHub.