Programování

Java XML a JSON: Zpracování dokumentů pro prostředí Java SE, Část 1: SAXON a Jackson

Předchozí 1 2 Strana 2 Stránka 2 ze 2

Proměna

Zkusme nyní transformaci. Proveďte následující příkaz:

java XSLTDemo books.xml books.xsl

Bohužel tato transformace selže: měli byste sledovat výstup, který identifikuje Apache Xalan jako továrnu na transformátory a chybová zpráva uvádějící, že xsl: pro každou skupinu není podporováno.

Pojď to zkusit znovu. Za předpokladu, že saxon9he.jar a XSLTDemo.class jsou umístěny v aktuálním adresáři, proveďte následující příkaz:

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

Tentokrát byste měli dodržovat následující seřazený a správně seskupený výstup:

Dodatek ke kapitole 11: Zpracování JSON s Jacksonem

Převod XML na JSON s Jacksonem

Java XML a JSON, kapitola 11, představuje Jackson, který poskytuje API pro analýzu a vytváření objektů JSON. Je také možné použít Jackson k převodu dokumentů XML na dokumenty JSON.

V této části vám ukážu dva způsoby, jak převést XML na JSON, nejprve s datovou vazbou a poté s procházením stromu. Předpokládám, že jste četli kapitolu 11 a znáte Jacksona. Chcete-li sledovat tato ukázka, měli byste si stáhnout následující soubory JAR z úložiště Maven:

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

Budete také potřebovat několik dalších souborů JAR; většina je společná pro obě techniky převodu. Brzy poskytnu informace o získání těchto souborů JAR.

Převést XML na JSON s datovou vazbou

Vazba dat umožňuje mapovat serializovaná data na objekt Java. Předpokládejme například, že máte malý dokument XML, který popisuje jednu planetu. Výpis 4 představuje tento dokument.

Výpis 4. planet.xml

  Země 3 9 

Výpis 5 představuje ekvivalentní prostředí Java Planeta třída, jejíž objekty se mapují na planet.xmlobsah.

Výpis 5. Planet.java

public class Planet {public Název řetězce; veřejné celé číslo planet_from_sun; veřejné celé číslo měsíce; }

Proces převodu vyžaduje, abyste nejprve analyzovali XML na Planeta objekt. Tohoto úkolu můžete dosáhnout prací s com.fasterxml.jackson.dataformat.xml.XmlMapper třídy, takto:

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

XmlMapper je přizpůsobený com.fasterxml.jackson.databind.ObjectMapper který čte a zapisuje XML. Poskytuje několik readValue () metody pro čtení jedné hodnoty XML ze vstupního zdroje specifického pro XML; například:

 T readValue (XMLStreamReader r, Class valueType)

Každý readValue () metoda vyžaduje a javax.xml.stream.XMLStreamReader objekt jako jeho první argument. Tento objekt je v podstatě syntaktický analyzátor založený na toku StAX pro efektivní analýzu textu dopředu.

Druhým argumentem je a java.lang.Class objekt pro cílový typ, který je vytvářen instancemi, naplněn daty XML a jehož instance je následně vrácena z metody.

Závěrem tohoto fragmentu kódu je, že obsah výpisu 4 je načten do a Planeta namítněte proti tomu readValue () se vrátí ke svému volajícímu.

Jakmile byl objekt vytvořen, je snadné jej pomocí práce zapsat jako JSON ObjectMapper a jeho String writeValueAsString (hodnota objektu) metoda:

ObjectMapper jsonMapper = nový ObjectMapper (); Řetězec json = jsonMapper.writeValueAsString (planeta);

Vyňal jsem tyto fragmenty kódu z XML2JSON aplikace, jejíž úplný zdrojový kód je uveden v seznamu 6.

Výpis 6. XML2JSON.java (verze 1)

importovat 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; importovat 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); Planet planet = xmlMapper.readValue (xmlsr, Planet.class); ObjectMapper jsonMapper = nový ObjectMapper (); Řetězec json = jsonMapper.writeValueAsString (planeta); out.println (json); }}

Než budete moci kompilovat výpisy 5 a 6, budete si muset stáhnout Jackson Dataformat XML, který implementuje XMLMapper. Stáhl jsem si verzi 2.9.7, která odpovídá verzím dalších tří Jacksonových balíčků.

Za předpokladu, že jste úspěšně stáhli jackson-dataformat-xml-2.9.7.jar, proveďte následující příkaz (pro lepší čitelnost rozložený na dva řádky) a zkompilujte 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

Než budete moci spustit výslednou aplikaci, budete si muset stáhnout Jackson Module: JAXB Annotations a také stáhnout StAX 2 API. Stáhl jsem si JAXB Annotations verze 2.9.7 a StAX 2 API verze 3.1.3.

Za předpokladu, že jste úspěšně stáhli jackson-module-jaxb-annotations-2.9.7.jar a stax2-api-3.1.3.jar, spusťte následující příkaz (pro lepší čitelnost rozložený na tři řádky) a spusťte aplikaci:

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

Pokud vše půjde dobře, měli byste dodržovat následující výstup:

{"name": "Země", "planet_from_sun": 3, "měsíce": 9}

Převeďte XML na JSON pomocí procházení stromu

Dalším způsobem, jak převést z XML na JSON, je nejprve analyzovat XML na strom uzlů JSON a poté tento strom zapsat do dokumentu JSON. První úkol můžete splnit voláním jednoho z XMLMapperje zděděno readTree () metody:

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

ObjectMapperje JsonNode readTree (byte [] obsah) metoda deserializuje obsah JSON do stromu jackson.databind.JsonNode objekty a vrátí kořen JsonNode předmět tohoto stromu. V XmlMapper kontext, tato metoda deserializuje obsah XML do stromu. V obou případech je obsah JSON nebo XML předán této metodě jako pole bajtů.

Druhý úkol - převod stromu objektů na JSON - se provádí podobným způsobem, jaký jsem předtím ukázal. Tentokrát je to JsonNode kořenový objekt, který je předán writeValueAsString ():

ObjectMapper jsonMapper = nový ObjectMapper (); Řetězec json = jsonMapper.writeValueAsString (uzel);

Vyňal jsem tyto fragmenty kódu z XML2JSON aplikace, jejíž úplný zdrojový kód je uveden v seznamu 7.

Výpis 7. XML2JSON.java (verze 2)

import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.xml.XmlMapper; importovat 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 (); Uzel JsonNode = xmlMapper.readTree (xml.getBytes ()); ObjectMapper jsonMapper = nový ObjectMapper (); Řetězec json = jsonMapper.writeValueAsString (uzel); out.println (json); }}

Proveďte následující příkaz (pro lepší čitelnost rozložený na dvou řádcích) a zkompilujte Výpis 7:

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

Než budete moci spustit výslednou aplikaci, budete si muset stáhnout Woodstox, což je vysoce výkonný procesor XML, který implementuje StAX, SAX2 a StAX2. Stáhl jsem si Woodstox 5.2.0. Poté spusťte následující příkaz (pro lepší čitelnost rozložený na tři řádky) a spusťte aplikaci:

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

Pokud vše půjde dobře, měli byste dodržovat následující výstup:

{"name": "Země", "planet_from_sun": "3", "měsíce": "1"}

Všimněte si, že čísla přiřazená k planet_from_sun a měsíce Elementy XML jsou namísto čísel serializovány do řetězců JSON. The readTree () Metoda neodvozuje datový typ při absenci explicitní definice typu.

Jacksonova podpora pro procházení stromu XML má další omezení:

  • Jackson není schopen rozlišovat mezi objekty a poli. Protože XML neposkytuje žádné prostředky k odlišení objektu od seznamu (pole) objektů, Jackson porovnává opakované prvky do jedné hodnoty.
  • Jackson nepodporuje smíšený obsah (textový obsah a prvky jako podřízené prvky). Místo toho mapuje každý prvek XML na a JsonNode objekt. Jakýkoli text je ztracen.

Vzhledem k těmto omezením není divu, že oficiální dokumentace Jacksona doporučuje analýzu XML do JsonNode-založené stromy. Lepší je použít techniku ​​převodu datové vazby.

Závěr

Materiál představený v tomto článku by měl být považován za dodatek ke kapitolám 6 a 11 ve druhém vydání Java XML a JSON. Naproti tomu můj další článek bude souviset s knihou, ale se zcela novým materiálem. Dávejte pozor na můj nadcházející článek o vazbě objektů Java na dokumenty JSON pomocí JSON-B.

Tento příběh „Java XML a JSON: Zpracování dokumentů pro prostředí Java SE, Část 1: SAXON a Jackson“ původně publikoval JavaWorld.