Programiranje

Java XML in JSON: Obdelava dokumentov za Java SE, 1. del: SAXON in Jackson

Prejšnja 1 2 Stran 2 Stran 2 od 2

Preobrazba

Zdaj poskusimo preobrazbo. Izvedite naslednji ukaz:

java XSLTDemo books.xml books.xsl

Na žalost ta preobrazba ne uspe: upoštevajte izhod, ki identificira Apache Xalan kot tovarno transformatorjev, in sporočilo o napaki, ki navaja, da xsl: za-vsako-skupino ni podprt.

Poskusimo znova. Predvidevam da saxon9he.jar in XSLTDemo.class se nahajajo v trenutnem imeniku, izvedite naslednji ukaz:

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

Tokrat morate upoštevati naslednje razvrščene in pravilno zbrane rezultate:

Dodatek k poglavju 11: Obdelava JSON z Jacksonom

Pretvorba XML v JSON z Jacksonom

Java XML in JSON, poglavje 11, predstavljata Jackson, ki ponuja API-je za razčlenjevanje in ustvarjanje objektov JSON. Za pretvorbo dokumentov XML v dokumente JSON je mogoče uporabiti tudi Jackson.

V tem razdelku vam bom pokazal dva načina za pretvorbo XML v JSON, najprej z vezavo podatkov in nato z drevesnim prehodom. Predvidevam, da ste prebrali 11. poglavje in da poznate Jacksona. Če želite slediti tem predstavitvam, bi morali iz skladišča Maven prenesti naslednje datoteke JAR:

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

Potrebovali boste tudi nekaj dodatnih datotek JAR; večina je skupna obema tehnikama pretvorbe. V kratkem bom posredoval informacije o pridobivanju teh datotek JAR.

Pretvorite XML v JSON z vezavo podatkov

Vezava podatkov vam omogoča preslikavo serializiranih podatkov v objekt Java. Denimo, da imate majhen dokument XML, ki opisuje posamezen planet. Seznam 4 predstavlja ta dokument.

Seznam 4. planet.xml

  Zemlja 3 9 

Seznam 5 predstavlja enakovredno Java Planet razred, katerega predmeti preslikajo na planet.xmlje vsebina.

Seznam 5. Planet.java

javni razred Planet {ime javnega niza; javno celo število planet_from_sun; javne lune Integer; }

Postopek pretvorbe zahteva, da najprej razčlenite XML v Planet predmet. To nalogo lahko dosežete z delom z com.fasterxml.jackson.dataformat.xml.XmlMapper razred, kot sledi:

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 po meri com.fasterxml.jackson.databind.ObjectMapper ki bere in piše XML. Zagotavlja več readValue () metode za branje posamezne vrednosti XML iz vhodnega vira, specifičnega za XML; na primer:

 T readValue (XMLStreamReader r, Class valueType)

Vsak readValue () metoda zahteva a javax.xml.stream.XMLStreamReader objekt kot prvi argument. Ta predmet je v bistvu razčlenjevalnik tokov, ki temelji na StAX-u, za učinkovito razčlenitev besedila naprej.

Drugi argument je a java.lang.Class objekt za ciljni tip, ki je v primerku, zapolnjen s podatki XML in katerega primerek se nato vrne iz metode.

Bottom line tega fragmenta kode je, da se vsebina navedbe 4 bere v Planet ugovarjajo, da readValue () se vrne klicatelju.

Ko je predmet ustvarjen, ga je enostavno zapisati kot JSON, tako da delate z njim ObjectMapper in svoje String writeValueAsString (vrednost predmeta) metoda:

ObjectMapper jsonMapper = nov ObjectMapper (); Niz json = jsonMapper.writeValueAsString (planet);

Te fragmente kode sem izvlekel iz XML2JSON aplikacija, katere celotna izvorna koda je navedena v seznamu 6.

Seznam 6. XML2JSON.java (različica 1)

uvoz java.io.FileReader; uvoz javax.xml.stream.XMLInputFactory; uvoz javax.xml.stream.XMLStreamReader; uvoz com.fasterxml.jackson.databind.ObjectMapper; uvoz com.fasterxml.jackson.dataformat.xml.XmlMapper; uvozi statični java.lang.System. *; javni razred XML2JSON {public static void main (String [] args) vrže izjemo {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 (); Niz json = jsonMapper.writeValueAsString (planet); out.println (json); }}

Preden lahko sestavite sezname 5 in 6, boste morali prenesti Jackson Dataformat XML, ki izvaja XMLMapper. Prenesel sem različico 2.9.7, ki se ujema z različicami ostalih treh paketov Jackson.

Ob predpostavki, da ste uspešno prenesli jackson-dataformat-xml-2.9.7.jar, za sestavljanje izvorne kode izvedite naslednji ukaz (razporedite v dve vrstici zaradi berljivosti):

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

Preden lahko zaženete nastalo aplikacijo, morate prenesti Jackson Module: JAXB Annotations in prenesti tudi StAX 2 API. Naložil sem JAXB Annotations različice 2.9.7 in StAX 2 API različice 3.1.3.

Ob predpostavki, da ste uspešno prenesli jackson-module-jaxb-annotations-2.9.7.jar in stax2-api-3.1.3.jar, za zagon aplikacije izvedite naslednji ukaz (razporedite v tri vrstice):

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

Če je vse v redu, upoštevajte naslednje rezultate:

{"name": "Zemlja", "planet_from_sun": 3, "lune": 9}

Pretvorite XML v JSON s prečkanjem dreves

Drug način za pretvorbo iz XML v JSON je najprej razčleniti XML v drevo vozlišč JSON in nato to drevo zapisati v dokument JSON. Prvo nalogo lahko opravite tako, da pokličete enega od XMLMapperje podedovana readTree () metode:

XmlMapper xmlMapper = nov XmlMapper (); Vozlišče JsonNode = xmlMapper.readTree (xml.getBytes ());

ObjectMapperje JsonNode readTree (bajtna [] vsebina) metoda deserializira vsebino JSON v drevo jackson.databind.JsonNode predmetov in vrne koren JsonNode predmet tega drevesa. V XmlMapper V kontekstu ta metoda deserializira vsebino XML v drevesu. V obeh primerih se vsebina JSON ali XML posreduje tej metodi kot niz bajtov.

Druga naloga - pretvorba drevesa predmetov v JSON - se izvede na podoben način kot prej. Tokrat je to JsonNode korenski objekt, ki mu je posredovan writeValueAsString ():

ObjectMapper jsonMapper = nov ObjectMapper (); Niz json = jsonMapper.writeValueAsString (vozlišče);

Te fragmente kode sem izvlekel iz XML2JSON aplikacija, katere celotna izvorna koda je navedena v seznamu 7.

Seznam 7. XML2JSON.java (različica 2)

uvoz com.fasterxml.jackson.databind.JsonNode; uvoz com.fasterxml.jackson.databind.ObjectMapper; uvoz com.fasterxml.jackson.dataformat.xml.XmlMapper; uvozi statični java.lang.System. *; javni razred XML2JSON {public static void main (String [] args) vrže izjemo {String xml = "\ n" + "\ n" + "Earth \ n" + "3 \ n" + "1 \ n" + "\ n "; XmlMapper xmlMapper = nov XmlMapper (); Vozlišče JsonNode = xmlMapper.readTree (xml.getBytes ()); ObjectMapper jsonMapper = nov ObjectMapper (); Niz json = jsonMapper.writeValueAsString (vozlišče); out.println (json); }}

Za sestavljanje seznama 7 izvedite naslednji ukaz (razporedite na dve vrstici zaradi berljivosti):

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

Preden lahko zaženete nastalo aplikacijo, morate prenesti Woodstox, visoko zmogljiv procesor XML, ki izvaja StAX, SAX2 in StAX2. Naložil sem Woodstox 5.2.0. Nato izvedite naslednji ukaz (za branje razporedite v tri vrstice), da zaženete aplikacijo:

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

Če je vse v redu, upoštevajte naslednje rezultate:

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

Upoštevajte, da so številke, dodeljene planet_od_sunca in lune Elementi XML so namesto številk serializirani v nize JSON. The readTree () metoda ne izpelje podatkovnega tipa, če ni eksplicitne definicije tipa.

Jacksonova podpora za prehod dreves XML ima dodatne omejitve:

  • Jackson ne more razlikovati med predmeti in nizi. Ker XML ne omogoča razlikovanja predmeta s seznama (polja) predmetov, Jackson ponavlja ponavljajoče se elemente v eno vrednost.
  • Jackson ne podpira mešana vsebina (besedilna vsebina in elementi kot otroci elementa). Namesto tega preslika vsak element XML v JsonNode predmet. Vsa besedila so izgubljena.

Glede na te omejitve ni presenetljivo, da uradna Jacksonova dokumentacija odsvetuje razčlenjevanje XML-ja JsonNodedrevesa. Bolje je, če uporabite tehniko pretvorbe podatkovne vezave.

Zaključek

Gradivo, predstavljeno v tem članku, je treba obravnavati kot dodatek k poglavjem 6 in 11 v drugi izdaji časopisa Java XML in JSON. Nasprotno pa bo moj naslednji članek povezan s knjigo, vendar povsem novim gradivom. Pazite na moj prihajajoči članek o vezavi predmetov Java na dokumente JSON z JSON-B.

To zgodbo "Java XML in JSON: Obdelava dokumentov za Java SE, 1. del: SAXON in Jackson" je prvotno objavil JavaWorld.