Programmering

Java XML og JSON: Dokumentbehandling til Java SE, del 1: SAXON og Jackson

Forrige 1 2 Side 2 Side 2 af 2

Transformation

Lad os nu prøve transformation. Udfør følgende kommando:

java XSLTDemo books.xml books.xsl

Desværre mislykkes denne transformation: du skal observere output, der identificerer Apache Xalan som transformerfabrikken og en fejlmeddelelse om, at xsl: for hver gruppe understøttes ikke.

Lad os prøve igen. Antages det saxon9he.jar og XSLTDemo.class er placeret i det aktuelle bibliotek, skal du udføre følgende kommando:

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

Denne gang skal du overholde følgende sorterede og korrekt grupperede output:

Tillæg til kapitel 11: Behandling af JSON med Jackson

Konvertering af XML til JSON med Jackson

Java XML og JSON, kapitel 11, introducerer Jackson, som leverer API'er til parsing og oprettelse af JSON-objekter. Det er også muligt at bruge Jackson til at konvertere XML-dokumenter til JSON-dokumenter.

I dette afsnit viser jeg dig to måder at konvertere XML til JSON, først med databinding og derefter med træovergang. Jeg antager, at du har læst kapitel 11 og er fortrolig med Jackson. For at følge disse demoer skal du have downloadet følgende JAR-filer fra Maven-arkivet:

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

Du har også brug for et par ekstra JAR-filer; de fleste er fælles for begge konverteringsteknikker. Jeg giver snart oplysninger om at få disse JAR-filer.

Konverter XML til JSON med databinding

Databinding lader dig kortlægge serielle data til et Java-objekt. Antag for eksempel, at du har et lille XML-dokument, der beskriver en enkelt planet. Liste 4 præsenterer dette dokument.

Notering 4. planet.xml

  Jorden 3 9 

Liste 5 viser en tilsvarende Java Planet klasse, hvis objekter kortlægges til planet.xmlindhold.

Fortegnelse 5. Planet.java

offentlig klasse Planet {offentligt strengnavn; offentlige heltal planet_fra sol; offentlige Heltal måner; }

Konverteringsprocessen kræver, at du først analyserer XML i en Planet objekt. Du kan udføre denne opgave ved at arbejde med com.fasterxml.jackson.dataformat.xml.XmlMapper klasse, som følger:

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

XmlMapper er en skræddersyet com.fasterxml.jackson.databind.ObjectMapper der læser og skriver XML. Det giver flere readValue () metoder til læsning af en enkelt XML-værdi fra en XML-specifik indgangskilde; for eksempel:

 T readValue (XMLStreamReader r, Class valueType)

Hver readValue () metoden kræver en javax.xml.stream.XMLStreamReader objekt som dets første argument. Dette objekt er i det væsentlige en StAX-baseret strømbaseret parser til effektiv parsing af tekst på en fremadrettet måde.

Det andet argument er en java.lang.Klasse objekt til den måltype, der bliver instantieret, udfyldt med XML-data, og hvis forekomst derefter returneres fra metoden.

Bundlinjen i dette kodefragment er, at Listing 4s indhold læses ind i en Planet gør indsigelse mod det readValue () vender tilbage til den, der ringer op.

Når objektet er oprettet, er det let at skrive det ud som JSON ved at arbejde med ObjectMapper ogdet er String writeValueAsString (Objektværdi) metode:

ObjectMapper jsonMapper = ny ObjectMapper (); String json = jsonMapper.writeValueAsString (planet);

Jeg uddragede disse kodefragmenter fra en XML2JSON applikation, hvis komplette kildekode vises i liste 6.

Annonce 6. XML2JSON.java (version 1)

importere java.io.FileReader; importere javax.xml.stream.XMLInputFactory; importere javax.xml.stream.XMLStreamReader; import com.fasterxml.jackson.databind.ObjectMapper; importer com.fasterxml.jackson.dataformat.xml.XmlMapper; importer statisk java.lang.System. *; offentlig klasse XML2JSON {offentlig statisk ugyldig hoved (String [] args) kaster undtagelse {XmlMapper xmlMapper = ny XmlMapper (); XMLInputFactory xmlif = XMLInputFactory.newFactory (); FileReader fr = ny FileReader ("planet.xml"); XMLStreamReader xmlsr = xmlif.createXMLStreamReader (fr); Planet planet = xmlMapper.readValue (xmlsr, Planet.class); ObjectMapper jsonMapper = ny ObjectMapper (); String json = jsonMapper.writeValueAsString (planet); out.println (json); }}

Inden du kan kompilere Liste 5 og 6, skal du downloade Jackson Dataformat XML, som implementeres XMLMapper. Jeg downloadede version 2.9.7, som matcher versionerne af de andre tre Jackson-pakker.

Forudsat at du har downloadet med succes jackson-dataformat-xml-2.9.7.jar, udfør følgende kommando (spredt over to linjer for læsbarhed) for at kompilere kildekoden:

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

Inden du kan køre den resulterende applikation, skal du downloade Jackson Module: JAXB Annotations og også downloade StAX 2 API. Jeg downloadede JAXB Annotations version 2.9.7 og StAX 2 API version 3.1.3.

Forudsat at du har downloadet med succes jackson-module-jaxb-annotations-2.9.7.jar og stax2-api-3.1.3.jar, udfør følgende kommando (spredt over tre linjer for læsbarhed) for at køre applikationen:

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

Hvis alt går godt, skal du overholde følgende output:

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

Konverter XML til JSON med træstraversal

En anden måde at konvertere fra XML til JSON er først at analysere XML i et træ med JSON-noder og derefter skrive dette træ til et JSON-dokument. Du kan udføre den første opgave ved at ringe til en af XMLMapperer arvet readTree () metoder:

XmlMapper xmlMapper = ny XmlMapper (); JsonNode-node = xmlMapper.readTree (xml.getBytes ());

ObjectMapper's JsonNode readTree (byte [] indhold) metode deserialiserer JSON-indhold til et træ af jackson.databind.JsonNode objekter og returnerer roden JsonNode genstand for dette træ. I en XmlMapper kontekst deserialiserer denne metode XML-indhold i træet. I begge tilfælde overføres JSON- eller XML-indholdet til denne metode som en række bytes.

Den anden opgave - at konvertere objekttræet til JSON - udføres på samme måde som det jeg tidligere viste. Denne gang er det den JsonNode rodobjekt, der sendes til writeValueAsString ():

ObjectMapper jsonMapper = ny ObjectMapper (); String json = jsonMapper.writeValueAsString (node);

Jeg uddragede disse kodefragmenter fra en XML2JSON applikation, hvis komplette kildekode vises i liste 7.

Liste 7. XML2JSON.java (version 2)

import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; importer com.fasterxml.jackson.dataformat.xml.XmlMapper; importer statisk java.lang.System. *; offentlig klasse XML2JSON {offentlig statisk ugyldig hoved (String [] args) kaster Undtagelse {String xml = "\ n" + "\ n" + "Earth \ n" + "3 \ n" + "1 \ n" + "\ n "; XmlMapper xmlMapper = ny XmlMapper (); JsonNode-node = xmlMapper.readTree (xml.getBytes ()); ObjectMapper jsonMapper = ny ObjectMapper (); String json = jsonMapper.writeValueAsString (node); out.println (json); }}

Udfør følgende kommando (spredt over to linjer for læsbarhed) for at kompilere Listing 7:

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

Inden du kan køre den resulterende applikation, skal du downloade Woodstox, som er en højtydende XML-processor, der implementerer StAX, SAX2 og StAX2. Jeg downloadede Woodstox 5.2.0. Udfør derefter følgende kommando (spredt over tre linjer for læsbarhed) for at køre applikationen:

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

Hvis alt går godt, skal du overholde følgende output:

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

Bemærk, at de numre, der er tildelt planet_fra_sun og måner XML-elementer serieliseres til JSON-strenge i stedet for tal. Det readTree () metoden udleder ikke datatypen i mangel af en eksplicit typedefinition.

Jacksons støtte til XML-træovergang har yderligere begrænsninger:

  • Jackson er ude af stand til at skelne mellem objekter og arrays. Da XML ikke giver mulighed for at skelne et objekt fra en liste (array) af objekter, samler Jackson gentagne elementer i en enkelt værdi.
  • Jackson støtter ikke blandet indhold (tekstindhold og elementer som børn af et element). I stedet kortlægger det hvert XML-element til en JsonNode objekt. Enhver tekst går tabt.

I betragtning af disse begrænsninger er det ikke overraskende, at den officielle Jackson-dokumentation anbefaler mod at analysere XML i JsonNode-baserede træer. Du har det bedre ved at bruge databindingskonverteringsteknikken.

Konklusion

Det materiale, der præsenteres i denne artikel, skal betragtes som et tillæg til kapitel 6 og 11 i anden udgave af Java XML og JSON. I modsætning hertil vil min næste artikel være relateret til bogen, men helt nyt materiale. Hold øje med min kommende artikel om binding af Java-objekter til JSON-dokumenter med JSON-B.

Denne historie, "Java XML og JSON: Dokumentbehandling til Java SE, del 1: SAXON og Jackson" blev oprindeligt udgivet af JavaWorld.