Programovanie

Java XML a JSON: Spracovanie dokumentov pre Java SE, časť 1: SAXON a Jackson

Predchádzajúca 1 2 Strana 2 Strana 2 z 2

Transformácia

Teraz sa pokúsime o transformáciu. Vykonajte nasledujúci príkaz:

java XSLTDemo books.xml books.xsl

Táto transformácia bohužiaľ zlyhala: mali by ste pozorovať výstup, ktorý identifikuje Apache Xalan ako továreň na transformátory, a chybové hlásenie, že xsl: pre každú skupinu nie je podporované.

Skúsme to opäť. Za predpokladu, že saxon9he.jar a XSLTDemo.class sa nachádzajú v aktuálnom adresári, vykonajte nasledujúci príkaz:

java -cp saxon9he.jar ;. XSLTDemo books.xml books.xsl

Tentokrát by ste mali sledovať nasledujúci zoradený a správne zoskupený výstup:

Dodatok k kapitole 11: Spracovanie JSON s Jacksonom

Prevod XML na JSON s Jacksonom

Java XML a JSON, kapitola 11, predstavuje Jackson, ktorý poskytuje API na analýzu a vytváranie objektov JSON. Je tiež možné použiť Jackson na konverziu dokumentov XML na dokumenty JSON.

V tejto časti si ukážeme dva spôsoby prevodu XML na JSON, najskôr pomocou dátovej väzby a potom cez stromový priechod. Budem predpokladať, že ste si prečítali 11. kapitolu a poznáte Jacksona. Ak chcete postupovať podľa týchto ukážok, mali ste si stiahnuť nasledujúce súbory JAR z úložiska Maven:

  • jackson-annotations-2.9.7.jar
  • jackson-core-2.9.7.jar
  • jackson-databind-2.9.7.jar

Budete tiež potrebovať niekoľko ďalších súborov JAR; väčšina je spoločná pre obidve techniky konverzie. Čoskoro poskytnem informácie o získaní týchto súborov JAR.

Preveďte XML na JSON pomocou dátovej väzby

Väzba údajov umožňuje mapovať serializované údaje na objekt Java. Predpokladajme napríklad, že máte malý dokument XML, ktorý popisuje jednu planétu. Zoznam 4 predstavuje tento dokument.

Zoznam 4. planet.xml

  Zem 3 9 

Zoznam 5 predstavuje ekvivalentnú Javu Planéta trieda, ktorej objekty sa mapujú na planet.xmlobsah.

Výpis 5. Planet.java

public class Planet {public Názov reťazca; public Integer planet_from_sun; verejné celé mesiace; }

Proces konverzie vyžaduje, aby ste najskôr analyzovali XML na a Planéta objekt. Túto úlohu môžete dosiahnuť spoluprácou s com.fasterxml.jackson.dataformat.xml.XmlMapper triedy nasledovne:

XmlMapper xmlMapper = nový XmlMapper (); XMLInputFactory xmlif = XMLInputFactory.newFactory (); FileReader fr = nový FileReader ("planet.xml"); XMLStreamReader xmlsr = xmlif.createXMLStreamReader (fr); Planéta planéta = xmlMapper.readValue (xmlsr, Planet.class);

XmlMapper je prispôsobený com.fasterxml.jackson.databind.ObjectMapper ktorý číta a píše XML. Poskytuje niekoľko readValue () metódy na čítanie jednej hodnoty XML zo vstupného zdroja špecifického pre XML; napríklad:

 T readValue (XMLStreamReader r, trieda valueType)

Každý readValue () metóda vyžaduje a javax.xml.stream.XMLStreamReader objekt ako prvý argument. Tento objekt je v podstate syntaktický analyzátor založený na toku StAX na efektívnu analýzu textu dopredu.

Druhým argumentom je a java.lang.Class objekt pre cieľový typ, ktorý sa vytvára inštanciou, je vyplnený údajmi XML a ktorého inštancia je následne vrátená z metódy.

Záverom tohto fragmentu kódu je, že obsah záznamu 4 sa načíta do a Planéta namietajte proti tomu readValue () vráti volajúcemu.

Po vytvorení objektu je ľahké ho pomocou spolupráce zapísať ako JSON ObjectMapper a jeho String writeValueAsString (hodnota objektu) metóda:

ObjectMapper jsonMapper = nový ObjectMapper (); Reťazec json = jsonMapper.writeValueAsString (planéta);

Vyňal som tieto fragmenty kódu z XML2JSON aplikácia, ktorej celý zdrojový kód sa nachádza v zozname 6.

Zoznam 6. XML2JSON.java (verzia 1)

import java.io.FileReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamReader; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.xml.XmlMapper; importovať statický java.lang.System. *; public class XML2JSON {public static void main (String [] args) throws Exception {XmlMapper xmlMapper = new XmlMapper (); XMLInputFactory xmlif = XMLInputFactory.newFactory (); FileReader fr = nový FileReader ("planet.xml"); XMLStreamReader xmlsr = xmlif.createXMLStreamReader (fr); Planéta planéta = xmlMapper.readValue (xmlsr, Planet.class); ObjectMapper jsonMapper = nový ObjectMapper (); Reťazec json = jsonMapper.writeValueAsString (planéta); out.println (json); }}

Predtým, ako budete môcť zostaviť zoznamy 5 a 6, musíte si stiahnuť Jackson Dataformat XML, ktorý implementuje XMLMapper. Stiahol som si verziu 2.9.7, ktorá sa zhoduje s verziami ďalších troch balíkov Jackson.

Za predpokladu, že ste sa úspešne stiahli jackson-dataformat-xml-2.9.7.jar, vykonajte nasledujúci príkaz (z dôvodu čitateľnosti rozložený na dva riadky), aby ste zostavili zdrojový kód:

javac -cp jackson-core-2.9.7.jar; jackson-databind-2.9.7.jar; jackson-dataformat-xml-2.9.7.jar ;. XML2JSON.java

Pred spustením výslednej aplikácie si musíte stiahnuť Jackson Module: JAXB Annotations a tiež stiahnuť StAX 2 API. Stiahol som si JAXB Annotations verzie 2.9.7 a StAX 2 API verzie 3.1.3.

Za predpokladu, že ste sa úspešne stiahli jackson-module-jaxb-annotations-2.9.7.jar a stax2-api-3.1.3.jar, spustite nasledujúci príkaz (kvôli čitateľnosti rozdelený do troch riadkov):

java -cp jackson-annotations-2.9.7.jar; jackson-core-2.9.7.jar; jackson-databind-2.9.7.jar; jackson-dataformat-xml-2.9.7.jar; jackson-module-jaxb-annotations-2.9.7.jar; stax2-api-3.1.3.jar ;. XML2JSON

Ak všetko pôjde dobre, mali by ste sledovať nasledujúci výstup:

{"name": "Zem", "planet_from_sun": 3, "mesiace": 9}

Preveďte XML na JSON pomocou prechodu stromom

Ďalším spôsobom, ako previesť z XML na JSON, je najskôr analyzovať XML na strom uzlov JSON a potom tento strom zapísať do dokumentu JSON. Prvú úlohu môžete splniť zavolaním jedného z nich XMLMapperje zdedený readTree () metódy:

XmlMapper xmlMapper = nový XmlMapper (); Uzol JsonNode = xmlMapper.readTree (xml.getBytes ());

ObjectMapperje JsonNode readTree (obsah bajtov []) metóda deserializuje obsah JSON na strom jackson.databind.JsonNode objekty a vráti koreň JsonNode objekt tohto stromu. V XmlMapper súvislosti táto metóda deserializuje obsah XML do stromu. V obidvoch prípadoch sa obsah JSON alebo XML odovzdá tejto metóde ako pole bajtov.

Druhá úloha - konverzia stromu objektov na JSON - sa vykonáva podobným spôsobom, aký som predtým ukázal. Tentokrát je to JsonNode koreňový objekt, ktorý je odovzdaný writeValueAsString ():

ObjectMapper jsonMapper = nový ObjectMapper (); Reťazec json = jsonMapper.writeValueAsString (uzol);

Vyňal som tieto fragmenty kódu z XML2JSON aplikácia, ktorej celý zdrojový kód sa nachádza v zozname 7.

Zoznam 7. XML2JSON.java (verzia 2)

import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.xml.XmlMapper; importovať statický java.lang.System. *; public class XML2JSON {public static void main (String [] args) throws Exception {String xml = "\ n" + "\ n" + "Earth \ n" + "3 \ n" + "1 \ n" + "\ n "; XmlMapper xmlMapper = nový XmlMapper (); Uzol JsonNode = xmlMapper.readTree (xml.getBytes ()); ObjectMapper jsonMapper = nový ObjectMapper (); Reťazec json = jsonMapper.writeValueAsString (uzol); out.println (json); }}

Vykonajte nasledujúci príkaz (kvôli čitateľnosti rozložený na dva riadky), aby ste zostavili záznam č. 7:

javac -cp jackson-core-2.9.7.jar; jackson-databind-2.9.7.jar; jackson-dataformat-xml-2.9.7.jar XML2JSON.java

Pred spustením výslednej aplikácie si musíte stiahnuť Woodstox, čo je vysoko výkonný procesor XML, ktorý implementuje StAX, SAX2 a StAX2. Stiahol som si Woodstox 5.2.0. Potom spustite nasledujúci príkaz (pre lepšiu čitateľnosť rozdelený do troch riadkov):

java -cp jackson-annotations-2.9.7.jar; jackson-core-2.9.7.jar; jackson-databind-2.9.7.jar; jackson-dataformat-xml-2.9.7.jar; stax2-api-3.1.3.jar; woodstox-core-5.2.0.jar ;. XML2JSON

Ak všetko pôjde dobre, mali by ste sledovať nasledujúci výstup:

{"name": "Earth", "planet_from_sun": "3", "moons": "1"}

Všimnite si, že čísla priradené k planet_from_sun a mesiace Prvky XML sa namiesto čísel serializujú do reťazcov JSON. The readTree () Metóda neodvodzuje dátový typ pri absencii explicitnej definície typu.

Jacksonova podpora prechodu stromom XML má ďalšie obmedzenia:

  • Jackson nie je schopný rozlišovať medzi objektmi a poľami. Pretože XML neposkytuje žiadne prostriedky na odlíšenie objektu od zoznamu (poľa) objektov, Jackson zhromažďuje opakované prvky do jednej hodnoty.
  • Jackson nepodporuje zmiešaný obsah (textový obsah a prvky ako podradené prvky). Namiesto toho mapuje každý prvok XML na a JsonNode objekt. Stratí sa akýkoľvek text.

Vzhľadom na tieto obmedzenia nie je prekvapujúce, že oficiálna dokumentácia spoločnosti Jackson odporúča parsovať XML na JsonNode- založené stromy. Lepšie je vám použiť techniku ​​prevodu viazania údajov.

Záver

Materiál uvedený v tomto článku by sa mal považovať za dodatok k kapitolám 6 a 11 v druhom vydaní Java XML a JSON. Naproti tomu môj ďalší článok bude súvisieť s knihou, ale s úplne novým materiálom. Dávajte pozor na môj nadchádzajúci článok o viazaní objektov Java na dokumenty JSON pomocou JSON-B.

Tento príbeh, „Java XML a JSON: Spracovanie dokumentov pre Java SE, časť 1: SAXON a Jackson“, bol pôvodne publikovaný spoločnosťou JavaWorld.

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