Προγραμματισμός

Java XML και JSON: Επεξεργασία εγγράφων για Java SE, Μέρος 1: SAXON και Jackson

Προηγούμενη 1 2 Σελίδα 2 Σελίδα 2 από 2

Μεταμόρφωση

Τώρα ας επιχειρήσουμε τον μετασχηματισμό. Εκτελέστε την ακόλουθη εντολή:

java XSLTDemo books.xml books.xsl

Δυστυχώς, αυτός ο μετασχηματισμός αποτυγχάνει: θα πρέπει να παρατηρήσετε έξοδο που προσδιορίζει το Apache Xalan ως εργοστάσιο μετασχηματιστή και ένα μήνυμα σφάλματος που δηλώνει ότι xsl: για κάθε ομάδα δεν υποστηρίζεται.

Ας δοκιμάσουμε ξανά. Υποθέτοντας ότι saxon9he.jar και XSLTDemo.class βρίσκονται στον τρέχοντα κατάλογο, εκτελέστε την ακόλουθη εντολή:

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

Αυτή τη φορά, θα πρέπει να παρατηρήσετε την ακόλουθη ταξινομημένη και σωστά ομαδοποιημένη έξοδο:

Προσθήκη στο Κεφάλαιο 11: Επεξεργασία του JSON με τον Τζάκσον

Μετατροπή XML σε JSON με τον Τζάκσον

Java XML και JSON, Κεφάλαιο 11, εισάγει το Jackson, το οποίο παρέχει API για την ανάλυση και τη δημιουργία αντικειμένων JSON. Είναι επίσης δυνατό να χρησιμοποιήσετε το Jackson για να μετατρέψετε έγγραφα XML σε έγγραφα JSON.

Σε αυτήν την ενότητα, θα σας δείξω δύο τρόπους για να μετατρέψετε το XML σε JSON, πρώτα με δέσμευση δεδομένων και μετά με διέλευση δέντρων. Θα υποθέσω ότι έχετε διαβάσει το Κεφάλαιο 11 και είστε εξοικειωμένοι με τον Τζάκσον. Για να ακολουθήσετε αυτές τις επιδείξεις, θα πρέπει να έχετε κατεβάσει τα ακόλουθα αρχεία JAR από το αποθετήριο Maven:

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

Θα χρειαστείτε επίσης μερικά επιπλέον αρχεία JAR. τα περισσότερα είναι κοινά και στις δύο τεχνικές μετατροπής. Θα παράσχω πληροφορίες σχετικά με τη λήψη αυτών των αρχείων JAR σύντομα.

Μετατροπή XML σε JSON με σύνδεση δεδομένων

Δεσμευτικά δεδομένα σας επιτρέπει να αντιστοιχίσετε σειριακά δεδομένα σε ένα αντικείμενο Java. Για παράδειγμα, ας υποθέσουμε ότι έχετε ένα μικρό έγγραφο XML που περιγράφει έναν μόνο πλανήτη. Η λίστα 4 παρουσιάζει αυτό το έγγραφο.

Λίστα 4. planet.xml

  Γη 3 9 

Η λίστα 5 παρουσιάζει μια ισοδύναμη Java Πλανήτης τάξη στην οποία αντιστοιχούν τα αντικείμενα planet.xmlτο περιεχόμενο.

Λίστα 5. Planet.java

Δημόσια τάξη Planet {public String name; δημόσιος Integer planet_from_sun; δημόσια Integer φεγγάρια? }

Η διαδικασία μετατροπής απαιτεί να αναλύσετε πρώτα το XML σε ένα Πλανήτης αντικείμενο. Μπορείτε να ολοκληρώσετε αυτήν την εργασία συνεργαζόμενοι με το com.fasterxml.jackson.dataformat.xml.XmlMapper τάξη, ως εξής:

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

XmlMapper είναι μια προσαρμοσμένη com.fasterxml.jackson.databind.ObjectMapper που διαβάζει και γράφει XML. Παρέχει πολλά readValue () μέθοδοι για την ανάγνωση μιας μεμονωμένης τιμής XML από μια πηγή εισόδου ειδικά για XML · για παράδειγμα:

 T readValue (XMLStreamReader r, Τύπος τιμής κλάσης)

Καθε readValue () μέθοδος απαιτεί ένα javax.xml.stream.XMLStreamReader αντικείμενο ως το πρώτο επιχείρημά του. Αυτό το αντικείμενο είναι ουσιαστικά ένα πρόγραμμα ανάλυσης ροής βασισμένο σε StAX για αποτελεσματική ανάλυση κειμένου με προώθηση.

Το δεύτερο επιχείρημα είναι ένα java.lang.Class αντικείμενο για τον τύπο προορισμού που δημιουργείται, συμπληρώνεται με δεδομένα XML και του οποίου η παρουσία επιστρέφεται στη συνέχεια από τη μέθοδο.

Η ουσία αυτού του τμήματος κώδικα είναι ότι το περιεχόμενο της Καταχώρισης 4 διαβάζεται σε ένα Πλανήτης αντικείμενο αυτό readValue () επιστρέφει στον καλούντα.

Μόλις δημιουργηθεί το αντικείμενο, είναι εύκολο να το γράψετε ως JSON δουλεύοντας με ObjectMapper και είναι String writeValueAsString (τιμή αντικειμένου) μέθοδος:

ObjectMapper jsonMapper = νέο ObjectMapper (); String json = jsonMapper.writeValueAsString (πλανήτης);

Απόσπασα αυτά τα τμήματα κώδικα από ένα XML2JSON εφαρμογή της οποίας ο πλήρης πηγαίος κώδικας εμφανίζεται στη Λίστα 6.

Λίστα 6. XML2JSON.java (Έκδοση 1)

εισαγωγή java.io.FileReader; εισαγωγή javax.xml.stream.XMLInputFactory; εισαγωγή javax.xml.stream.XMLStreamReader; εισαγωγή com.fasterxml.jackson.databind.ObjectMapper; εισαγωγή com.fasterxml.jackson.dataformat.xml.XmlMapper; εισαγωγή στατικού java.lang.System. *; δημόσια τάξη XML2JSON {public static void main (String [] args) ρίχνει την Εξαίρεση {XmlMapper xmlMapper = new XmlMapper (); XMLInputFactory xmlif = XMLInputFactory.newFactory (); FileReader fr = νέο FileReader ("planet.xml"); XMLStreamReader xmlsr = xmlif.createXMLStreamReader (fr); Planet planet = xmlMapper.readValue (xmlsr, Planet.class); ObjectMapper jsonMapper = νέο ObjectMapper (); String json = jsonMapper.writeValueAsString (πλανήτης); out.println (json); }}

Για να μπορέσετε να μεταγλωττίσετε τις λίστες 5 και 6, θα πρέπει να κατεβάσετε το Jackson Dataformat XML, το οποίο υλοποιεί XMLMapper. Έκανα λήψη της έκδοσης 2.9.7, η οποία ταιριάζει με τις εκδόσεις των άλλων τριών πακέτων Jackson.

Υποθέτοντας ότι έχετε κατεβάσει με επιτυχία jackson-dataformat-xml-2.9.7.jar, εκτελέστε την ακόλουθη εντολή (απλωμένη σε δύο γραμμές για αναγνωσιμότητα) για να μεταγλωττίσετε τον πηγαίο κώδικα:

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

Για να μπορέσετε να εκτελέσετε την εφαρμογή που προκύπτει, θα πρέπει να κάνετε λήψη του Jackson Module: JAXB Annotations και επίσης να κάνετε λήψη του StAX 2 API. Κατέβασα JAXB Annotations έκδοση 2.9.7 και StAX 2 API έκδοση 3.1.3.

Υποθέτοντας ότι έχετε κατεβάσει με επιτυχία jackson-module-jaxb-annotations-2.9.7.jar και stax2-api-3.1.3.jar, εκτελέστε την ακόλουθη εντολή (απλωμένη σε τρεις γραμμές για αναγνωσιμότητα) για να εκτελέσετε την εφαρμογή:

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

Εάν όλα πάνε καλά, θα πρέπει να παρατηρήσετε την ακόλουθη έξοδο:

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

Μετατροπή XML σε JSON με διέλευση δέντρων

Ένας άλλος τρόπος για να μετατρέψετε από XML σε JSON είναι πρώτα να αναλύσετε το XML σε ένα δέντρο των κόμβων JSON και στη συνέχεια να γράψετε αυτό το δέντρο σε ένα έγγραφο JSON. Μπορείτε να ολοκληρώσετε την πρώτη εργασία καλώντας ένα από ένα XMLMapperκληρονομείται readTree () μέθοδοι:

XmlMapper xmlMapper = νέο XmlMapper (); JsonNode node = xmlMapper.readTree (xml.getBytes ());

ObjectMapper'μικρό JsonNode readTree (περιεχόμενο byte []) Η μέθοδος απολυμαίνει το περιεχόμενο JSON σε ένα δέντρο jackson.databind.JsonNode αντικείμενα και επιστρέφει τη ρίζα JsonNode αντικείμενο αυτού του δέντρου. Σε ένα XmlMapper πλαίσιο, αυτή η μέθοδος απολυμαίνει το περιεχόμενο XML στο δέντρο. Και στις δύο περιπτώσεις, το περιεχόμενο JSON ή XML μεταβιβάζεται σε αυτήν τη μέθοδο ως πίνακας byte.

Η δεύτερη εργασία - μετατροπή του δέντρου των αντικειμένων σε JSON - πραγματοποιείται με παρόμοιο τρόπο με αυτό που έδειξα προηγουμένως. Αυτή τη φορά, είναι το JsonNode αντικείμενο ρίζας στο οποίο μεταβιβάστηκε writeValueAsString ():

ObjectMapper jsonMapper = νέο ObjectMapper (); String json = jsonMapper.writeValueAsString (κόμβος);

Απόσπασα αυτά τα τμήματα κώδικα από ένα XML2JSON εφαρμογή της οποίας ο πλήρης πηγαίος κώδικας εμφανίζεται στη Λίστα 7.

Λίστα 7. XML2JSON.java (έκδοση 2)

εισαγωγή com.fasterxml.jackson.databind.JsonNode; εισαγωγή com.fasterxml.jackson.databind.ObjectMapper; εισαγωγή com.fasterxml.jackson.dataformat.xml.XmlMapper; εισαγωγή στατικού java.lang.System. *; δημόσια τάξη XML2JSON {public static void main (String [] args) ρίχνει την Εξαίρεση {String xml = "\ n" + "\ n" + "Earth \ n" + "3 \ n" + "1 \ n" + "\ ν "; XmlMapper xmlMapper = νέο XmlMapper (); JsonNode node = xmlMapper.readTree (xml.getBytes ()); ObjectMapper jsonMapper = νέο ObjectMapper (); String json = jsonMapper.writeValueAsString (κόμβος); out.println (json); }}

Εκτελέστε την ακόλουθη εντολή (απλωμένη σε δύο γραμμές για αναγνωσιμότητα) για να μεταγλωττίσετε την Καταχώριση 7:

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

Για να μπορέσετε να εκτελέσετε την εφαρμογή που προκύπτει, θα πρέπει να κάνετε λήψη του Woodstox, ο οποίος είναι ένας επεξεργαστής XML υψηλής απόδοσης που εφαρμόζει StAX, SAX2 και StAX2. Έκανα λήψη του Woodstox 5.2.0. Στη συνέχεια, εκτελέστε την ακόλουθη εντολή (απλωμένη σε τρεις γραμμές για αναγνωσιμότητα) για να εκτελέσετε την εφαρμογή:

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

Εάν όλα πάνε καλά, θα πρέπει να παρατηρήσετε την ακόλουθη έξοδο:

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

Παρατηρήστε ότι οι αριθμοί που έχουν εκχωρηθεί στο planet_from_sun και φεγγάρια Τα στοιχεία XML σειριοποιούνται σε συμβολοσειρές JSON αντί για αριθμούς. ο readTree () Η μέθοδος δεν συμπεραίνει τον τύπο δεδομένων ελλείψει ρητού ορισμού τύπου.

Η υποστήριξη του Τζάκσον για τη διέλευση δέντρων XML έχει επιπλέον περιορισμούς:

  • Ο Τζάκσον δεν μπορεί να κάνει διάκριση μεταξύ αντικειμένων και συστοιχιών. Επειδή η XML δεν παρέχει κανένα μέσο για τη διαφοροποίηση ενός αντικειμένου από μια λίστα (πίνακας) αντικειμένων, ο Τζάκσον συγκεντρώνει επαναλαμβανόμενα στοιχεία σε μία μόνο τιμή.
  • Ο Τζάκσον δεν υποστηρίζει μικτό περιεχόμενο (περιεχόμενο κειμένου και στοιχεία ως παιδιά ενός στοιχείου). Αντ 'αυτού, χαρτογραφεί κάθε στοιχείο XML σε ένα JsonNode αντικείμενο. Κάθε κείμενο χάνεται.

Δεδομένων αυτών των περιορισμών, δεν προκαλεί έκπληξη το γεγονός ότι η επίσημη τεκμηρίωση του Τζάκσον συνιστά να μην αναλυθεί το XML JsonNode- δέντρα με βάση Καλύτερα να χρησιμοποιήσετε την τεχνική μετατροπής δέσμευσης δεδομένων.

συμπέρασμα

Το υλικό που παρουσιάζεται σε αυτό το άρθρο πρέπει να θεωρηθεί ως προσθήκη στα κεφάλαια 6 και 11 στη δεύτερη έκδοση του Java XML και JSON. Αντιθέτως, το επόμενο άρθρο μου θα σχετίζεται με το βιβλίο, αλλά εντελώς νέο υλικό. Παρακολουθήστε το επερχόμενο άρθρο μου σχετικά με τη σύνδεση αντικειμένων Java σε έγγραφα JSON με το JSON-B

Αυτή η ιστορία, "Java XML και JSON: Επεξεργασία εγγράφων για Java SE, Μέρος 1: SAXON και Jackson" δημοσιεύθηκε αρχικά από την JavaWorld.