Programavimas

„Java XML“ ir „JSON“: „Java SE“ dokumentų apdorojimas, 1 dalis: „SAXON“ ir „Jackson“

Ankstesnis 1 2 2 puslapis 2 puslapis iš 2

Transformacija

Dabar pabandykime transformuotis. Vykdykite šią komandą:

java XSLTDemo books.xml books.xsl

Deja, ši transformacija nepavyksta: turėtumėte stebėti išvestį, kurioje Apache Xalan identifikuojama kaip transformatoriaus gamykla, ir klaidos pranešimą, kuriame teigiama, kad xsl: kiekvienai grupei nėra palaikomas.

Pabandykime dar kartą. Tariant, kad saxon9he.jar ir XSLTDemo.class yra dabartiniame kataloge, vykdykite šią komandą:

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

Šį kartą turėtumėte stebėti šiuos surūšiuotus ir tinkamai sugrupuotus išvestis:

11 skyriaus priedas: JSON apdorojimas su Jacksonu

XML konvertavimas į JSON su Jacksonu

„Java XML“ ir „JSON“ 11 skyriuje pristatomas „Jackson“, kuris pateikia API JSON objektų analizavimui ir kūrimui. Taip pat galima naudoti „Jackson“ XML dokumentus konvertuoti į JSON dokumentus.

Šiame skyriuje aš jums parodysiu du būdus, kaip konvertuoti XML į JSON, pirmiausia susiejant duomenis, o tada pereinant medžius. Aš manysiu, kad jūs perskaitėte 11 skyrių ir esate susipažinę su Jacksonu. Norėdami sekti šias demonstracines versijas, turėtumėte atsisiųsti šiuos JAR failus iš „Maven“ saugyklos:

  • jacksonas-anotacijos-2.9.7.jar
  • jackson-core-2.9.7.jar
  • jackson-databind-2.9.7.jar

Jums taip pat reikės kelių papildomų JAR failų; dauguma yra būdingi abiem konversijos metodams. Netrukus pateiksiu informaciją apie šių JAR failų gavimą.

Konvertuokite XML į JSON, susiedami duomenis

Duomenų įpareigojimas leidžia susieti serijinius duomenis su „Java“ objektu. Pavyzdžiui, tarkime, kad turite mažą XML dokumentą, kuriame aprašoma viena planeta. 4 sąraše pateikiamas šis dokumentas.

Sąrašas 4. planet.xml

  Žemė 3 9 

5 sąraše pateikiama lygiavertė „Java“ Planeta klasė, kurios objektai susieti planeta.xmlturinys.

Sąrašas 5. Planeta.java

public class Planet {public String name; public Integer planet_from_sun; viešieji sveikieji mėnuliai; }

Konversijos procesas reikalauja, kad pirmiausia XML analizuotumėte į Planeta objektas. Šią užduotį galite atlikti dirbdami su com.fasterxml.jackson.dataformat.xml.XmlMapper klasę:

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

„XmlMapper“ yra pritaikytas com.fasterxml.jackson.databind.ObjectMapper kad skaito ir rašo XML. Tai teikia keletą readValue () vienos XML vertės nuskaitymo iš XML specifinio įvesties šaltinio metodai; pavyzdžiui:

 T readValue (XMLStreamReader r, Class valueType)

Kiekvienas readValue () metodas reikalauja a javax.xml.stream.XMLStreamReader objektas kaip pirmasis argumentas. Šis objektas iš esmės yra StAX pagrįstas srauto analizatorius, skirtas efektyviai analizuoti tekstą į priekį.

Antrasis argumentas yra a java.lang.Klasė objekto paskirties tipui, kuris yra momentinis, užpildytas XML duomenimis ir kurio egzempliorius vėliau grąžinamas iš metodo.

Apatinė šio kodo fragmento eilutė yra ta, kad 4 sąrašo turinys perskaitomas į Planeta prieštarauti tam readValue () grįžta pas savo skambintoją.

Sukūrus objektą, lengva jį parašyti kaip JSON dirbant ObjectMapper ir tai String writeValueAsString (objekto vertė) metodas:

ObjectMapper jsonMapper = naujas ObjectMapper (); Stygos json = jsonMapper.writeValueAsString (planeta);

Šiuos kodo fragmentus ištraukiau iš XML2JSON programa, kurios visas šaltinio kodas rodomas 6 sąraše.

6 sąrašas. XML2JSON.java (1 versija)

importuoti java.io.FileReader; importuoti javax.xml.stream.XMLInputFactory; importuoti javax.xml.stream.XMLStreamReader; importuoti com.fasterxml.jackson.databind.ObjectMapper; importuoti com.fasterxml.jackson.dataformat.xml.XmlMapper; importuoti statinę java.lang.System. *; public class XML2JSON {public static void main (String [] args) meta išimtį {XmlMapper xmlMapper = new XmlMapper (); XMLInputFactory xmlif = XMLInputFactory.newFactory (); FileReader fr = new FileReader ("planet.xml"); XMLStreamReader xmlsr = xmlif.createXMLStreamReader (fr); Planetos planeta = xmlMapper.readValue (xmlsr, Planet.class); ObjectMapper jsonMapper = new ObjectMapper (); Stygos json = jsonMapper.writeValueAsString (planeta); out.println (json); }}

Prieš sudarydami 5 ir 6 sąrašus, turėsite atsisiųsti „Jackson Dataformat XML“, kuris įgyvendinamas „XMLMapper“. Atsisiunčiau 2.9.7 versiją, kuri atitinka kitų trijų „Jackson“ paketų versijas.

Darant prielaidą, kad sėkmingai atsisiuntėte jackson-dataformat-xml-2.9.7.jar, vykdydami šią komandą (paskirstykite per dvi eilutes, kad būtų lengviau skaityti), kad sukompiluotumėte šaltinio kodą:

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

Kad galėtumėte paleisti gautą programą, turite atsisiųsti „Jackson Module: JAXB Annotations“ ir „StAX 2“ API. Aš atsisiunčiau JAXB Annotations 2.9.7 versiją ir „StAX 2 API“ 3.1.3 versiją.

Darant prielaidą, kad sėkmingai atsisiuntėte jackson-module-jaxb-annotations-2.9.7.jar ir stax2-api-3.1.3.jar, vykdydami šią programą, vykdykite šią komandą (paskirstytą trijose eilutėse, kad būtų lengviau skaityti):

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

Jei viskas gerai, turėtumėte stebėti šį rezultatą:

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

Konvertuokite XML į JSON naudodamiesi medžiu

Kitas būdas konvertuoti iš XML į JSON yra pirmiausia išanalizuoti XML į JSON mazgų medį ir tada įrašyti šį medį į JSON dokumentą. Pirmąją užduotį galite atlikti paskambinę vienai iš „XMLMapper“paveldėtas „readTree“ () metodai:

XmlMapper xmlMapper = naujas XmlMapper (); „JsonNode“ mazgas = xmlMapper.readTree (xml.getBytes ());

ObjectMapper's „JsonNode“ skaitymo medis (baitų [] turinys) metodas deserializuoja JSON turinį į jackson.databind.JsonNode objektus ir grąžina šaknį JsonNode šio medžio objektas. Į „XmlMapper“ kontekste šis metodas deserializuoja XML turinį į medį. Bet kuriuo atveju JSON arba XML turinys šiam metodui perduodamas kaip baitų masyvas.

Antroji užduotis - objektų medžio pavertimas JSON - atliekama panašiai, kaip aš anksčiau rodžiau. Šį kartą tai JsonNode pagrindinis objektas, kuriam perduota writeValueAsString ():

ObjectMapper jsonMapper = naujas ObjectMapper (); Eilutė json = jsonMapper.writeValueAsString (mazgas);

Šiuos kodo fragmentus ištraukiau iš XML2JSON programa, kurios visas šaltinio kodas rodomas 7 sąraše.

7 sąrašas. XML2JSON.java (2 versija)

importuoti com.fasterxml.jackson.databind.JsonNode; importuoti com.fasterxml.jackson.databind.ObjectMapper; importuoti com.fasterxml.jackson.dataformat.xml.XmlMapper; importuoti statinę java.lang.System. *; public class XML2JSON {public static void main (String [] args) meta išimtį {String xml = "\ n" + "\ n" + "Earth \ n" + "3 \ n" + "1 \ n" + "\ n "; XmlMapper xmlMapper = naujas XmlMapper (); „JsonNode“ mazgas = xmlMapper.readTree (xml.getBytes ()); ObjectMapper jsonMapper = new ObjectMapper (); Eilutė json = jsonMapper.writeValueAsString (mazgas); out.println (json); }}

Norėdami sudaryti 7 sąrašą, vykdykite šią komandą (perskirstytą per dvi eilutes, kad būtų lengviau skaityti):

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

Kad galėtumėte paleisti gautą programą, turite atsisiųsti „Woodstox“, kuris yra didelio našumo XML procesorius, diegiantis „StAX“, „SAX2“ ir „StAX2“. Aš atsisiunčiau „Woodstox 5.2.0“. Tada vykdykite šią komandą (skirstykite per tris eilutes, kad būtų lengviau skaityti), kad paleistumėte programą:

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

Jei viskas gerai, turėtumėte stebėti šį rezultatą:

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

Atkreipkite dėmesį, kad planeta_ is_sun ir mėnuliai XML elementai yra nuoseklūs JSON eilutėse, o ne skaičiuose. „readTree“ () metodas nenumato duomenų tipo, jei nėra aiškaus tipo apibrėžimo.

Jackson palaikymas XML medžių perėjimui turi papildomų apribojimų:

  • Džeksonas nesugeba atskirti objektų nuo masyvų. Kadangi XML nenumato priemonių atskirti objektą nuo objektų sąrašo (masyvo), Jacksonas pakartoja elementus į vieną vertę.
  • Džeksonas nepalaiko mišrus turinys (tekstinis turinys ir elementai kaip elemento vaikai). Vietoj to, jis susieja kiekvieną XML elementą su a JsonNode objektas. Pamestas bet koks tekstas.

Atsižvelgiant į šiuos apribojimus, nenuostabu, kad oficialioje Jacksono dokumentacijoje rekomenduojama nenagrinėti XML į JsonNode-medžių pagrindu. Jums geriau naudoti duomenų įrišimo konvertavimo techniką.

Išvada

Šiame straipsnyje pateikta medžiaga turėtų būti laikoma antrojo 2004 m. Leidimo 6 ir 11 skyrių priedu „Java XML“ ir „JSON“. Priešingai, kitas mano straipsnis bus susijęs su knyga, bet visiškai nauja medžiaga. Stebėkite mano būsimą straipsnį apie „Java“ objektų susiejimą su JSON dokumentais naudojant JSON-B.

Šią istoriją „Java XML ir JSON:„ Java SE “dokumentų apdorojimas, 1 dalis:„ SAXON “ir„ Jackson ““ iš pradžių paskelbė „JavaWorld“.