Programmēšana

Java XML un JSON: dokumentu apstrāde Java SE, 1. daļa: SAXON un Jackson

Iepriekšējā 1 2 2. lapa 2. lapa no 2

Pārvērtības

Tagad mēģināsim pārveidot. Izpildiet šādu komandu:

java XSLTDemo books.xml books.xsl

Diemžēl šī pārveidošana neizdodas: jums jāievēro izeja, kas Apache Xalan identificē kā transformatoru rūpnīcu, un kļūdas ziņojums, kurā norādīts, ka xsl: katrai grupai netiek atbalstīts.

Pamēģināsim vēlreiz. Pieņemot, ka saxon9he.jar un XSLTDemo.class atrodas pašreizējā direktorijā, izpildiet šādu komandu:

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

Šoreiz jums jāievēro šāda sakārtota un pareizi sagrupēta izeja:

11. nodaļas papildinājums: JSON apstrāde ar Džeksonu

XML konvertēšana uz JSON ar Džeksonu

Java XML un JSON, 11. nodaļa, iepazīstina ar Džeksonu, kas nodrošina API JSON objektu parsēšanai un izveidei. Ir iespējams arī izmantot Džeksonu, lai XML dokumentus pārveidotu par JSON dokumentiem.

Šajā sadaļā es jums parādīšu divus veidus, kā XML konvertēt uz JSON, vispirms ar datu saistīšanu un pēc tam ar koku šķērsošanu. Es pieņemu, ka jūs esat izlasījis 11. nodaļu un esat pazīstams ar Džeksonu. Lai sekotu šīm demonstrācijām, no Maven repozitorija jums bija jāielādē šādi JAR faili:

  • džeksons-anotācijas-2.9.7.jar
  • jackson-core-2.9.7.jar
  • jackson-databind-2.9.7.jar

Jums būs nepieciešami arī daži papildu JAR faili; lielākā daļa ir kopīgas abām konversijas metodēm. Drīz es sniegšu informāciju par šo JAR failu iegūšanu.

Konvertējiet XML uz JSON ar datu saistīšanu

Datu saistīšana ļauj kartēt sērijveida datus Java objektam. Piemēram, pieņemsim, ka jums ir mazs XML dokuments, kas apraksta vienu planētu. 4. saraksts ir šis dokuments.

Saraksts 4. planet.xml

  Zeme 3 9 

5. saraksts parāda līdzvērtīgu Java Planēta klase, kuras objekti kartē planeta.xmlsaturs.

Uzskaitījums 5. Planet.java

public class Planet {public String name; public Integer planet_from_sun; publiskie veseli mēness; }

Konvertēšanas procesā vispirms XML parsē a Planēta objekts. Jūs varat paveikt šo uzdevumu, strādājot ar com.fasterxml.jackson.dataformat.xml.XmlMapper klase:

XmlMapper xmlMapper = jauns XmlMapper (); XMLInputFactory xmlif = XMLInputFactory.newFactory (); FileReader fr = new FileReader ("planet.xml"); XMLStreamReader xmlsr = xmlif.createXMLStreamReader (fr); Planētas planēta = xmlMapper.readValue (xmlsr, Planet.class);

XmlMapper ir pielāgots com.fasterxml.jackson.databind.ObjectMapper kas lasa un raksta XML. Tas nodrošina vairākus readValue () metodes vienas XML vērtības nolasīšanai no XML specifiska ievades avota; piemēram:

 T readValue (XMLStreamReader r, Class valueType)

Katrs readValue () metode prasa a javax.xml.stream.XMLStreamReader objekts kā pirmais arguments. Šis objekts būtībā ir StAX bāzes straumēšanas parsētājs, lai efektīvi parsētu tekstu uz priekšu.

Otrais arguments ir a java.lang.Class objekts mērķa tipam, kas tiek instantizēts, aizpildīts ar XML datiem un kura eksemplārs vēlāk tiek atgriezts no metodes.

Šī koda fragmenta apakšējā rinda ir tāda, ka 4. saraksta saturs tiek nolasīts a Planēta iebilst, ka readValue () atgriežas pie sava zvanītāja.

Kad objekts ir izveidots, to ir viegli izrakstīt kā JSON, strādājot ar ObjectMapper un tas ir String writeValueAsString (objekta vērtība) metode:

ObjectMapper jsonMapper = jauns ObjectMapper (); Virkne json = jsonMapper.writeValueAsString (planēta);

Es izvilku šos koda fragmentus no XML2JSON lietojumprogramma, kuras pilnais pirmkods ir redzams 6. sarakstā.

Listing 6. XML2JSON.java (versija 1)

importēt java.io.FileReader; importēt javax.xml.stream.XMLInputFactory; importēt javax.xml.stream.XMLStreamReader; importēt com.fasterxml.jackson.databind.ObjectMapper; importēt com.fasterxml.jackson.dataformat.xml.XmlMapper; importēt statisko java.lang.System. *; public class XML2JSON {public static void main (String [] args) throws Exception {XmlMapper xmlMapper = new XmlMapper (); XMLInputFactory xmlif = XMLInputFactory.newFactory (); FileReader fr = new FileReader ("planet.xml"); XMLStreamReader xmlsr = xmlif.createXMLStreamReader (fr); Planētas planēta = xmlMapper.readValue (xmlsr, Planet.class); ObjectMapper jsonMapper = jauns ObjectMapper (); Virkne json = jsonMapper.writeValueAsString (planēta); out.println (json); }}

Lai varētu apkopot 5. un 6. sarakstu, jums būs jālejupielādē Jackson Dataformat XML, kas tiek ieviests XMLMapper. Es lejupielādēju 2.9.7 versiju, kas atbilst pārējo trīs Džeksona pakotņu versijām.

Pieņemot, ka esat veiksmīgi lejupielādējis jackson-dataformat-xml-2.9.7.jar, izpildiet šādu komandu (lasāmībai sadaliet divās rindās), lai apkopotu avota kodu:

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

Pirms varat palaist iegūto lietojumprogrammu, jums būs jāielādē Jackson Module: JAXB Annotations un arī StAX 2 API. Es lejupielādēju JAXB Annotations versiju 2.9.7 un StAX 2 API versiju 3.1.3.

Pieņemot, ka esat veiksmīgi lejupielādējis jackson-module-jaxb-annotations-2.9.7.jar un stax2-api-3.1.3.jar, lai palaistu lietojumprogrammu, izpildiet šādu komandu (lasāmības dēļ sadaliet pa trim rindām):

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

Ja viss norit labi, jums jāievēro šāda izeja:

{"name": "Earth", "planet_from_sun": 3, "pavadoņi": 9}

Pārvērst XML par JSON ar koku šķērsošanu

Vēl viens veids, kā pārveidot no XML uz JSON, ir vispirms parsēt XML JSON mezglu kokā un pēc tam ierakstīt šo koku JSON dokumentā. Pirmo uzdevumu varat paveikt, piezvanot uz kādu no XMLMapperir iedzimta lasīt koku () metodes:

XmlMapper xmlMapper = jauns XmlMapper (); JsonNode mezgls = xmlMapper.readTree (xml.getBytes ());

ObjectMapper's JsonNode readTree (baitu [] saturs) metode deserializē JSON saturu kokā jackson.databind.JsonNode objektus un atgriež sakni JsonNode šī koka objekts. In XmlMapper kontekstā šī metode deserializē XML saturu kokā. Jebkurā gadījumā JSON vai XML saturs tiek nodots šai metodei kā baitu masīvs.

Otrais uzdevums - objektu koka pārveidošana par JSON - tiek izpildīts līdzīgi tam, ko es iepriekš parādīju. Šoreiz tas ir JsonNode saknes objekts, kuram nodots writeValueAsString ():

ObjectMapper jsonMapper = jauns ObjectMapper (); Virkne json = jsonMapper.writeValueAsString (mezgls);

Es izvilku šos koda fragmentus no XML2JSON lietojumprogramma, kuras pilnais pirmkods ir redzams 7. sarakstā.

7. saraksts: XML2JSON.java (2. versija)

importēt com.fasterxml.jackson.databind.JsonNode; importēt com.fasterxml.jackson.databind.ObjectMapper; importēt com.fasterxml.jackson.dataformat.xml.XmlMapper; importēt statisko java.lang.System. *; public class XML2JSON {public static void main (String [] args) izmet izņēmumu {String xml = "\ n" + "\ n" + "Earth \ n" + "3 \ n" + "1 \ n" + "\ n "; XmlMapper xmlMapper = jauns XmlMapper (); JsonNode mezgls = xmlMapper.readTree (xml.getBytes ()); ObjectMapper jsonMapper = jauns ObjectMapper (); Virkne json = jsonMapper.writeValueAsString (mezgls); out.println (json); }}

Izpildiet šo komandu (sadalot pa divām rindām lasāmības labā), lai apkopotu 7. sarakstu:

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

Pirms varat palaist iegūto lietojumprogrammu, jums būs jālejupielādē Woodstox, kas ir augstas veiktspējas XML procesors, kas ievieš StAX, SAX2 un StAX2. Es lejupielādēju Woodstox 5.2.0. Pēc tam izpildiet šādu komandu (lasāmības dēļ sadaliet pa trim rindām), lai palaistu lietojumprogrammu:

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

Ja viss norit labi, jums jāievēro šāda izeja:

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

Ievērojiet, ka numuram piešķirtie numuri planeta_no_sun un pavadoņi XML elementi tiek sērijveidoti JSON virknēs, nevis skaitļos. The lasīt koku () metode nenosaka datu tipu, ja nav skaidras tipa definīcijas.

Džeksona atbalstam XML koka šķērsošanai ir papildu ierobežojumi:

  • Džeksons nespēj atšķirt objektus no masīviem. Tā kā XML nenodrošina līdzekļus objekta atšķiršanai no objektu saraksta (masīva), Džeksons atkārtotos elementus apkopo vienā vērtībā.
  • Džeksons neatbalsta jaukts saturs (teksta saturs un elementi kā elementa bērni). Tā vietā tas katru XML elementu kartē ar a JsonNode objekts. Jebkurš teksts tiek zaudēts.

Ņemot vērā šos ierobežojumus, nav pārsteidzoši, ka oficiālajā Džeksona dokumentācijā nav ieteicams parsēt XML JsonNodebalstīti koki. Jums labāk izmantot datu saistīšanas pārveidošanas tehniku.

Secinājums

Šajā rakstā sniegtais materiāls jāuzskata par papildinājumu 6. Un 11. Nodaļai Java XML un JSON. Turpretī mans nākamais raksts būs saistīts ar grāmatu, bet pilnīgi jaunu materiālu. Neuzmaniet manu gaidāmo rakstu par Java objektu saistīšanu ar JSON dokumentiem, izmantojot JSON-B.

Šo stāstu "Java XML un JSON: dokumentu apstrāde Java SE, 1. daļa: SAXON un Džeksons" sākotnēji publicēja JavaWorld.

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