Ohjelmointi

Java XML ja JSON: Asiakirjojen käsittely Java SE: lle, osa 1: SAXON ja Jackson

Edellinen 1 2 Sivu 2 Sivu 2/2

Muutos

Yritetään nyt muuttaa. Suorita seuraava komento:

java XSLTDemo books.xml books.xsl

Valitettavasti tämä muunnos epäonnistuu: sinun tulisi tarkkailla lähtöä, joka tunnistaa Apache Xalanin muuntajatehtaaksi, ja virheilmoituksen xsl: jokaiselle ryhmälle ei ole tuettu.

Yritetään uudestaan. Olettaen että saxon9he.jar ja XSLTDemo.class sijaitsevat nykyisessä hakemistossa, suorita seuraava komento:

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

Tällä kertaa sinun on noudatettava seuraavaa lajiteltuja ja oikein ryhmiteltyjä lähtöjä:

Lisäys kappaleeseen 11: JSON: n käsittely Jacksonin kanssa

XML: n muuntaminen JSON: ksi Jacksonin avulla

Java XML ja JSON, luku 11, esittelee Jacksonin, joka tarjoaa API: t JSON-objektien jäsentämiseen ja luomiseen. Jacksonilla on myös mahdollista muuntaa XML-asiakirjat JSON-asiakirjoiksi.

Tässä osiossa näytän sinulle kaksi tapaa muuntaa XML JSON: ksi ensin tietojen sitomisella ja sitten puiden läpikäynnillä. Oletan, että olet lukenut luvun 11 ja tunnet Jacksonin. Näiden demojen seuraamiseksi sinun on ladattava seuraavat JAR-tiedostot Maven-arkistosta:

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

Tarvitset myös muutaman ylimääräisen JAR-tiedoston; useimmat ovat yhteisiä molemmille muuntotekniikoille. Annan tietoja näiden JAR-tiedostojen hankkimisesta pian.

Muunna XML JSON: ksi tietojen sitomisella

Tietojen sitominen voit yhdistää sarjoitetut tiedot Java-objektiin. Oletetaan, että sinulla on esimerkiksi pieni XML-asiakirja, joka kuvaa yhtä planeettaa. Listaus 4 esittää tämän asiakirjan.

Listaus 4. planet.xml

  Maa 3 9 

Luettelossa 5 on vastaava Java Planeetta luokka, jonka objektit kartoittavat planet.xmlsisällön.

Listaus 5. Planet.java

julkinen luokka Planeetta {julkinen merkkijono nimi; public Integer planet_from_sun; julkiset kokonaislukut; }

Muunnosprosessi edellyttää, että ensin jäsennät XML: n a: ksi Planeetta esine. Voit suorittaa tämän tehtävän työskentelemällä com.fasterxml.jackson.dataformat.xml.XmlMapper luokka seuraavasti:

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

XmlMapper on räätälöity com.fasterxml.jackson.databind.ObjectMapper joka lukee ja kirjoittaa XML: ää. Se tarjoaa useita readValue () menetelmät yksittäisen XML-arvon lukemiseksi XML-spesifisestä tulolähteestä; esimerkiksi:

 T readValue (XMLStreamReader r, luokan arvoTyyppi)

Jokainen readValue () menetelmä edellyttää a javax.xml.stream.XMLStreamReader esine ensimmäisenä argumenttinaan. Tämä objekti on pohjimmiltaan StAX-pohjainen stream-pohjainen jäsennin tekstin tehokkaaseen jäsentämiseen eteenpäin.

Toinen argumentti on a java.lang.luokka kohde kohdetyypille, joka on instantioitu, täytetty XML-tiedoilla ja jonka ilmentymä palautetaan myöhemmin menetelmästä.

Tämän koodinpätkän viimeinen rivi on, että Listing 4: n sisältö luetaan a Planeetta vastustaa sitä readValue () palaa soittajalle.

Kun objekti on luotu, on helppo kirjoittaa se JSON-muotoon työskentelemällä ObjectMapper ja se on Merkkijono writeValueAsString (objektiarvo) menetelmä:

ObjectMapper jsonMapper = uusi ObjectMapper (); Merkkijono json = jsonMapper.writeValueAsString (planeetta);

Otin nämä koodinpätkät XML2JSON sovellus, jonka täydellinen lähdekoodi näkyy luettelossa 6.

Listing 6. XML2JSON.java (Versio 1)

tuo java.io.FileReader; tuo javax.xml.stream.XMLInputFactory; tuo javax.xml.stream.XMLStreamReader; tuo com.fasterxml.jackson.databind.ObjectMapper; tuo com.fasterxml.jackson.dataformat.xml.XmlMapper; tuo staattinen java.lang.System. *; public class XML2JSON {public static void main (String [] args) heittää poikkeuksen {XmlMapper xmlMapper = new XmlMapper (); XMLInputFactory xmlif = XMLInputFactory.newFactory (); FileReader fr = uusi FileReader ("planet.xml"); XMLStreamReader xmlsr = xmlif.createXMLStreamReader (fr); Planeetan planeetta = xmlMapper.readValue (xmlsr, Planet.class); ObjectMapper jsonMapper = uusi ObjectMapper (); Merkkijono json = jsonMapper.writeValueAsString (planeetta); out.println (json); }}

Ennen kuin voit koota luettelot 5 ja 6, sinun on ladattava Jackson Dataformat XML, joka toteutetaan XMLMapper. Latasin version 2.9.7, joka vastaa kolmen muun Jackson-paketin versiota.

Olettaen, että lataus onnistui jackson-dataformat-xml-2.9.7.jar, suorita seuraava komento (jaettu kahteen riviin luettavuuden vuoksi) lähdekoodin kääntämiseksi:

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

Ennen kuin voit suorittaa tuloksena olevan sovelluksen, sinun on ladattava Jackson Module: JAXB Annotations ja ladattava myös StAX 2 -sovellusliittymä. Latasin JAXB-merkinnät version 2.9.7 ja StAX 2 API-version 3.1.3.

Olettaen, että lataus onnistui jackson-module-jaxb-annotations-2.9.7.jar ja stax2-api-3.1.3.jar, suorita seuraava komento (jaettu kolmeen riviin luettavuuden vuoksi) sovelluksen ajamiseksi:

java -cp jackson-annotations-2.9.7.jar; jackson-core-2.9.7.jar; jackson-databaseind-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

Jos kaikki menee hyvin, sinun on noudatettava seuraavaa tulosta:

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

Muunna XML JSON: ksi puun läpi kulkemalla

Toinen tapa muuntaa XML: stä JSON: ksi on ensin jäsentää XML JSON-solmujen puuksi ja sitten kirjoittaa tämä puu JSON-asiakirjaan. Voit suorittaa ensimmäisen tehtävän soittamalla johonkin XMLMapperon peritty readTree () menetelmät:

XmlMapper xmlMapper = uusi XmlMapper (); JsonNode-solmu = xmlMapper.readTree (xml.getBytes ());

ObjectMapperon JsonNode readTree (tavu [] -sisältö) menetelmä deserialisoi JSON-sisällön jackson.databind.JsonNode ja palauttaa juuren JsonNode tämän puun esine. Vuonna XmlMapper kontekstissa tämä menetelmä deserialisoi XML-sisällön puuhun. Kummassakin tapauksessa JSON- tai XML-sisältö välitetään tähän menetelmään tavuina.

Toinen tehtävä - objektipuun muuntaminen JSON: ksi - suoritetaan samalla tavalla kuin aiemmin. Tällä kertaa se on JsonNode pääobjekti, joka välitetään writeValueAsString ():

ObjectMapper jsonMapper = uusi ObjectMapper (); Merkkijono json = jsonMapper.writeValueAsString (solmu);

Otin nämä koodinpätkät XML2JSON sovellus, jonka täydellinen lähdekoodi näkyy luettelossa 7.

Listaus 7. XML2JSON.java (versio 2)

tuo com.fasterxml.jackson.databind.JsonNode; tuo com.fasterxml.jackson.databind.ObjectMapper; tuo com.fasterxml.jackson.dataformat.xml.XmlMapper; tuo staattinen java.lang.System. *; public class XML2JSON {public static void main (String [] args) heittää poikkeuksen {String xml = "\ n" + "\ n" + "Earth \ n" + "3 \ n" + "1 \ n" + "\ n "; XmlMapper xmlMapper = uusi XmlMapper (); JsonNode-solmu = xmlMapper.readTree (xml.getBytes ()); ObjectMapper jsonMapper = uusi ObjectMapper (); Merkkijono json = jsonMapper.writeValueAsString (solmu); out.println (json); }}

Suorita seuraava komento (hajautettu kahdelle riville luettavuuden vuoksi) luettelon 7 kokoamiseksi:

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

Ennen kuin voit suorittaa tuloksena olevan sovelluksen, sinun on ladattava Woodstox, joka on erittäin suorituskykyinen XML-prosessori, joka toteuttaa StAX: n, SAX2: n ja StAX2: n. Latasin Woodstox 5.2.0: n. Suorita sitten seuraava komento (jaettu kolmeen riviin luettavuuden vuoksi) sovelluksen ajamiseksi:

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

Jos kaikki menee hyvin, sinun on noudatettava seuraavaa tulosta:

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

Huomaa, että planet_from_sun ja kuut XML-elementit sarjoitetaan JSON-merkkijonoihin numeroiden sijaan. readTree () method ei johda tietotyyppiä, jos nimenomaista tyypin määritelmää ei ole.

Jacksonin tuella XML-puun läpikululle on muita rajoituksia:

  • Jackson ei pysty erottamaan esineitä ja taulukoita. Koska XML ei tarjoa keinoja erottaa objekti objektiluettelosta (taulukosta), Jackson kerää toistuvat elementit yhdeksi arvoksi.
  • Jackson ei tue sekoitettu sisältö (tekstisisältö ja elementit elementin lapsina). Sen sijaan se kartoittaa jokaisen XML-elementin a-kohtaan JsonNode esine. Kaikki teksti menetetään.

Näiden rajoitusten vuoksi ei ole yllättävää, että virallisissa Jackson-ohjeissa suositellaan XML: n jäsentämistä JsonNode-pohjaiset puut. Sinun on parempi käyttää datan sitomisen muuntotekniikkaa.

Johtopäätös

Tässä artikkelissa esitettyä materiaalia on pidettävä vuoden 2005 toisen painoksen 6 ja 11 luvun lisäyksenä Java XML ja JSON. Sen sijaan seuraava artikkeli liittyy kirjaan, mutta täysin uuteen materiaaliin. Pidä silmällä tulevaa artikkeliani Java-objektien sitomisesta JSON-asiakirjoihin JSON-B: llä.

Tämän tarinan "Java XML ja JSON: Asiakirjojen käsittely Java SE: lle, osa 1: SAXON ja Jackson" julkaisi alun perin JavaWorld.

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