Μετατροπή JSON σε XML Java χρησιμοποιώντας Gson και JAXB με Παράδειγμα
Τι είναι το JSON;
Το JSON είναι μια συντομογραφία του Javascript Σημείωση αντικειμένου, η οποία είναι μια μορφή δεδομένων που ακολουθεί έναν ορισμένο κανόνα ότι οι περισσότερες γλώσσες προγραμματισμού είναι προς το παρόν αναγνώσιμες. Μπορούμε εύκολα να το αποθηκεύσουμε σε ένα αρχείο ή να καταγράψουμε στη βάση δεδομένων. Η μορφή JSON χρησιμοποιεί ζεύγη κλειδιών-τιμών για την περιγραφή δεδομένων.
Ακολουθώντας το παράδειγμα, ορίζουμε μια συμβολοσειρά JSON που αποθηκεύει προσωπικές πληροφορίες:
{
"username" : "guru99user",
"email" : "guru99user@mail.com"
}
Άρα η σύνταξη του JSON είναι πολύ απλή. Κάθε πληροφορία δεδομένων θα έχει δύο μέρη: κλειδί και τιμή που αντιστοιχούν στο όνομα του πεδίου και στην τιμή του σε μια συγκεκριμένη εγγραφή. Αλλά κοιτάζοντας περαιτέρω, υπάρχουν μερικά πράγματα όπως αυτό:
- Η συμβολοσειρά JSON περικλείεται από σγουρά άγκιστρα {}.
- Τα κλειδιά και οι τιμές του JSON πρέπει να περικλείονται σε εισαγωγικά {“}.
- Εάν υπάρχουν περισσότερα δεδομένα (περισσότερα ζεύγη κλειδιών => τιμών), χρησιμοποιούμε κόμματα (,) για να διαχωρίσουμε.
- Τα κλειδιά JSON θα πρέπει να είναι γράμματα ή αριθμοί χωρίς υπογραφή, _ και χωρίς κενά, ο πρώτος χαρακτήρας δεν πρέπει να ορίζεται σε αριθμούς.
Τι είναι το XML;
Η XML σημαίνει επεκτάσιμη γλώσσα σήμανσης που ονομάζεται επίσης επεκτάσιμη γλώσσα σήμανσης που προτείνεται από την Κοινοπραξία του Παγκόσμιου Ιστού (https://www.w3.org/) για να δημιουργήσετε άλλες γλώσσες σήμανσης. Αυτό είναι ένα απλό υποσύνολο που μπορεί να περιγράψει πολλούς διαφορετικούς τύπους δεδομένων, επομένως είναι πολύ χρήσιμο για την κοινή χρήση δεδομένων μεταξύ συστημάτων.
Οι ετικέτες στο XML συχνά δεν είναι προκαθορισμένες, αλλά δημιουργούνται σύμφωνα με τις συμβάσεις του χρήστη. XML εισάγει νέες δυνατότητες βασισμένες στα πλεονεκτήματα της HTML.
Υπάρχουν μερικές πιο χρήσιμες δυνατότητες δημιουργίας XML σε διάφορα συστήματα και λύσεις:
- Η XML είναι επεκτάσιμη: Η XML σάς επιτρέπει να δημιουργήσετε τις δικές σας προσαρμοσμένες ετικέτες που ταιριάζουν στην εφαρμογή σας.
- Η XML μεταφέρει δεδομένα, δεν τα εμφανίζει: Η XML σάς επιτρέπει να αποθηκεύετε δεδομένα ανεξάρτητα από το πώς θα εμφανιστούν.
- Η XML είναι ένα κοινό πρότυπο: Η XML αναπτύχθηκε από την Κοινοπραξία του Παγκόσμιου Ιστού (W3C) και είναι διαθέσιμη ως ανοιχτό πρότυπο.
Η XML είναι χτισμένη σε μια ένθετη δομή κόμβου. Κάθε κόμβος θα έχει μια ετικέτα ανοίγματος και μια ετικέτα κλεισίματος ως εξής:
<node>content</node>
Στο οποίο:
- είναι μια ανοιχτή ετικέτα, το όνομα αυτής της ετικέτας ορίζεται από εσάς.
- είναι μια κλειστή ετικέτα, το όνομα αυτής της ετικέτας πρέπει να ταιριάζει με το όνομα της ανοιχτής ετικέτας.
- περιεχόμενο είναι το περιεχόμενο αυτής της ετικέτας.
Στο επάνω μέρος κάθε αρχείου XML πρέπει να δηλώσετε μια ετικέτα για να υποδείξετε την έκδοση XML που χρησιμοποιείται. Η σύνταξη της ετικέτας εντολών:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Τι είναι ο Gson;
Γκσον (https://github.com/google/gson) είναι μια βιβλιοθήκη java που επιτρέπει στους χρήστες να κάνουν μετατροπή από α Java αντικείμενο σε συμβολοσειρά JSON και επίσης μετατροπή από συμβολοσειρά JSON σε Java αντικείμενο. Ο Gson μπορεί να εργαστεί με αυθαίρετα Java αντικείμενα συμπεριλαμβανομένων των υπαρχόντων αντικειμένων χωρίς να έχετε τον πηγαίο κώδικα τους.
Από την έκδοση 1.6, ο Gson εισάγει δύο νέες κατηγορίες – JsonReader JsonWriter για την παροχή επεξεργασίας ροής σε δεδομένα JSON.
- JsonWriter – Ροή εγγραφής σε JSON. Η σύνταξη για τη γενική υλοποίηση είναι η εξής. Δημιουργούμε α JsonWriter αντικείμενο. Για να ξεκινήσουμε και να ολοκληρώσουμε τη δημιουργία μιας συμβολοσειράς JSON, χρησιμοποιούμε τη συνάρτηση startObject() endObject(). Στη μέση της εκτέλεσης αυτών των δύο συναρτήσεων, εκτελούμε εγγραφή δεδομένων με ζεύγη (κλειδί => τιμή).
JsonWriter writer = new JsonWriter();
writer.beginObject();
writer.name("key").value("value");
writer.endObject();
- JsonReader – Ανάγνωση ροής από JSON. Η σύνταξη για τη γενική υλοποίηση είναι η εξής. Δημιουργούμε ένα αντικείμενο JsonReader. Για να ξεκινήσουμε και να ολοκληρώσουμε τη δημιουργία μιας συμβολοσειράς JSON, χρησιμοποιούμε τη συνάρτηση beginObject() και endObject(). Στη μέση της εκτέλεσης αυτών των δύο συναρτήσεων, εκτελούμε ανάγνωση δεδομένων με ζεύγη (κλειδί => τιμή).
JsonReader reader = new JsonReader();
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("key")) {
String value = reader.nextString();
}
}
reader.endObject();
Η επεξεργασία ροής Gson είναι γρήγορη. Ωστόσο, πρέπει να χειριστείτε κάθε ζεύγος (κλειδί => τιμή) επεξεργασίας δεδομένων JSON.
Τι είναι το JAXB;
JAXB σημαίνει Java Architecture για XML Binding, η οποία είναι μια βιβλιοθήκη που χρησιμοποιεί σχολιασμούς για τη μετατροπή Java αντικείμενα σε περιεχόμενο XML και αντίστροφα. Καθώς το JAXB ορίζεται μέσω μιας προδιαγραφής, μπορούμε να χρησιμοποιήσουμε διαφορετικές υλοποιήσεις για αυτό το πρότυπο.
Με το JAXB, χρησιμοποιούμε συχνά τους ακόλουθους βασικούς σχολιασμούς, και συγκεκριμένα:
- @XmlRootElement: Αυτός ο σχολιασμός καθορίζει ποια είναι η πιο εξωτερική ετικέτα του αρχείου XML και επομένως δηλώνεται στην κορυφή μιας κλάσης.
- @XmlElementWrapper: Αυτός ο σχολιασμός δημιουργεί ένα στοιχείο XML περιτυλίγματος γύρω από τις συλλογές.
- @XmlElement: Αυτός ο σχολιασμός που χρησιμοποιείται για να δηλώσει ένα χαρακτηριστικό του αντικειμένου είναι μια ετικέτα του αρχείου XML.
- @XmlAttribute: Αυτός ο σχολιασμός που χρησιμοποιείται επίσης για να δηλώσει ότι ένα χαρακτηριστικό του αντικειμένου είναι μια ετικέτα του αρχείου XML.
Η σύνταξη για τη γενική υλοποίηση είναι η εξής. Αρχικά, θα αρχικοποιήσουμε το JAXBCcontext αντικείμενο με το MyObject αντικείμενο για μετατροπή.
JAXBContext jaxbContext = JAXBContext.newInstance(MyObject.class);
Σε αυτή τη JAXBCcontext αντικείμενο, έχει μια μέθοδο για τη δημιουργία ενός αντικειμένου που μετατρέπει περιεχόμενο XML σε α Java αντικείμενο, Unmarshaller.
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Σε αυτή τη JAXBCcontext αντικείμενο, έχει μια μέθοδο για τη δημιουργία του αντικειμένου που μετατρέπει το Java αντιταχθείτε στο περιεχόμενο XML δηλαδή Μάρσαλερ.
Marshaller marshallerObj = jaxbContext.createMarshaller();
Πώς να μετατρέψετε XML σε JSON;
Υλοποιούμε το παράδειγμα μετατροπής XML – JSON στην πλατφόρμα:
- Ανοίξτε το JDK 8 για Ubuntu 18.04 x64.
- Eclipse IDE 2019-03 (4.11.0) x64 Java Ανάπτυξη για Ubuntu.
- Gson 2.8.5.
Βήμα 1) Δημιουργία έργου.
Δημιουργήστε ένα νέο Java Εργο.

Βήμα 2) Ορισμός ονόματος έργου.
Ορισμός Όνομα έργου είναι Παράδειγμα XmlToJson.
Βήμα 3) Δημιουργήστε ένα φάκελο.
Δημιουργία φακέλου εισαγωγή δεδομένων που περιέχει δύο αρχεία δείγμα.xml δείγμα.json.
Ας ορίσουμε πρώτα το XML μας με τμήμα, ρόλος person ιδιότητες.
Η γενική αρχιτεκτονική είναι: ; .
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <root> <department> <roles> <role id="1"> <position>head</position> <salary>10k</salary> </role> <role id="2"> <position>manager</position> <salary>8k</salary> </role> <role id="3"> <position>employee</position> <salary>5k</salary> </role> </roles> <persons> <person id="1"> <name>Red</name> <role>1</role> </person> <person id="2"> <name>Green</name> <role>2</role> </person> <person id="3"> <name>Blue</name> <role>2</role> </person> <person id="4"> <name>Yellow</name> <role>3</role> </person> <person id="5"> <name>Brown</name> <role>3</role> </person> </persons> </department> </root>
Δεύτερον, ορίζουμε το JSON έχοντας την ίδια ιδέα:
{
"roles": [
{
"id": "1",
"position": "head",
"salary": "10k",
"persons": [
{
"id": "1",
"name": "Red"
}
]
},
{
"id": "2",
"position": "manager",
"salary": "8k",
"persons": [
{
"id": "2",
"name": "Green"
},
{
"id": "3",
"name": "Blue"
}
]
},
{
"id": "3",
"position": "employee",
"salary": "5k",
"persons": [
{
"id": "4",
"name": "Yellow"
},
{
"id": "5",
"name": "Brown"
}
]
}
]
}
Βήμα 4) Ορισμός αντικειμένου.
Ορίστε τις αντίστοιχες κατηγορίες αντικειμένων στο πακέτο μοντέλο.
- Role.java:
@XmlRootElement(name = "role")
public class Role {
private String id;
private String position;
private String salary;
public Role() {
super();
}
public Role(String id, String position, String salary) {
super();
this.id = id;
this.position = position;
this.salary = salary;
}
@XmlAttribute(name = "id")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@XmlElement(name = "position")
public String getPosition() {
return position;
}
public void setPosition(String position) {
this.position = position;
}
@XmlElement(name = "salary")
public String getSalary() {
return salary;
}
public void setSalary(String salary) {
this.salary = salary;
}
}
- Person.java:
@XmlRootElement(name = "person")
public class Person {
private String id;
private String name;
private String role;
public Person() {
super();
}
public Person(String id, String name, String role) {
super();
this.id = id;
this.name = name;
this.role = role;
}
@XmlAttribute(name = "id")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@XmlElement(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement(name = "role")
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
}
- Department.java:
@XmlRootElement(name = "department")
public class Department {
private List<Role> roles;
private List<Person> persons;
public Department() {
super();
}
public Department(List<Role> roles, List<Person> persons) {
super();
this.roles = roles;
this.persons = persons;
}
@XmlElementWrapper(name = "roles")
@XmlElement(name = "role")
public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
@XmlElementWrapper(name = "persons")
@XmlElement(name = "person")
public List<Person> getPersons() {
return persons;
}
public void setPersons(List<Person> persons) {
this.persons = persons;
}
}
XMLModel.java:
@XmlRootElement(name = "root")
public class XMLModel {
private Department department;
public XMLModel() {
super();
}
public XMLModel(Department department) {
super();
this.department = department;
}
@XmlElement(name = "department")
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
}
Βήμα 5) Ρύθμιση βιβλιοθήκης.
Προσθέστε και ρυθμίστε τη βιβλιοθήκη Gson 2.8.5 σε Java Κατασκευή μονοπατιού.
Μετατροπή μηνύματος XML σε Java αντικείμενα που χρησιμοποιούν JAXB
Αρχικά, ορίζουμε την απόδοση σε ταξινομημένη συσκευασία υπηρεσία.
Στο πρώτο βήμα της πρώτης διαδικασίας, χρησιμοποιούμε την τεχνική Un-marshalling του JAXB.
Το Un-marshalling παρέχει σε μια εφαρμογή πελάτη τη δυνατότητα να μετατρέπει δεδομένα XML σε προερχόμενα από JAXB Java αντικείμενα.
Ορίζουμε τη συνάρτηση getObjectFromXmlFile για να καταργήσουμε το αρχείο XML μας πίσω στο a Java αντικείμενο. Αυτή η συνάρτηση ορίζεται στην τάξη XMLService.
public XMLModel getObjectFromXmlFile(String filePath) {
try {
File file = new File(filePath);
JAXBContext jaxbContext = JAXBContext.newInstance(XMLModel.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
XMLModel root = (XMLModel) jaxbUnmarshaller.unmarshal(file);
return root;
} catch (JAXBException e) {
e.printStackTrace();
return null;
}
}
Καλούμε τον παραπάνω κωδικό στην τάξη XmlToJsonService.
XMLService xmlService = new XMLService(); XMLModel xmlModel = xmlService.getObjectFromXmlFile(filePathIn); Department department = xmlModel.getDepartment(); List<Role> roles = department.getRoles(); List<Person> persons = department.getPersons();
Μετά πάμε στο επόμενο βήμα.
Μετατρέπω Java αντικειμένων στο μήνυμα JSON χρησιμοποιώντας το Gson
Σε αυτό το βήμα, ορίζουμε τη συνάρτηση writeDataToJsonFile για να γράψετε δεδομένα στο αρχείο JSON. Αυτή η συνάρτηση ορίζεται στην τάξη JsonService.
Σημειώστε ότι για να γράψουμε μια λίστα με συμβολοσειρές JSON, χρησιμοποιούμε τη συνάρτηση BeginArray() endArray(). Μεταξύ αυτών των δύο συναρτήσεων, γράφουμε κάθε συμβολοσειρά JSON.
public void writeDataToJsonFile(String filePath, List<Role> roles, List<Person> persons) {
try {
JsonWriter writer = new JsonWriter(new FileWriter(filePath));
writer.setIndent(" ");
writer.beginObject();
writer.name("roles");
writer.beginArray();
for (Role role : roles) {
writer.beginObject();
writer.name("id").value(role.getId());
writer.name("position").value(role.getPosition());
writer.name("salary").value(role.getSalary());
writer.name("persons");
writer.beginArray();
for (Person person : persons) {
if (person.getRole().equalsIgnoreCase(role.getId())) {
writer.beginObject();
writer.name("id").value(person.getId());
writer.name("name").value(person.getName());
writer.endObject();
}
}
writer.endArray();
writer.endObject();
}
writer.endArray();
writer.endObject();
writer.close();
} catch (IOException e) {
}
}
Καλούμε τον παραπάνω κωδικό στην τάξη XmlToJsonService.
JsonService jsonService = new JsonService(); jsonService.writeDataToJsonFile(filePathOut, roles, persons);
Αυτή είναι η πρώτη διαδικασία.
Μετατροπή μηνύματος JSON σε Java αντικείμενα που χρησιμοποιούν το Gson
Στο πρώτο βήμα της δεύτερης διαδικασίας, ορίζουμε τη συνάρτηση getDataFromJsonFile για να διαβάσετε δεδομένα από το αρχείο JSON. Αυτή η συνάρτηση ορίζεται στην τάξη JsonService.
Σημειώστε ότι για να διαβάσουμε μια λίστα με συμβολοσειρές JSON, χρησιμοποιούμε τη συνάρτηση BeginArray() endArray(). Μεταξύ αυτών των δύο συναρτήσεων, διαβάζουμε κάθε συμβολοσειρά JSON.
public void getDataFromJsonFile(String filePath, List<Role> roles, List<Person> persons) {
try {
JsonReader reader = new JsonReader(new FileReader(filePath));
reader.beginObject();
while (reader.hasNext()) {
String nameRoot = reader.nextName();
if (nameRoot.equals("roles")) {
reader.beginArray();
while (reader.hasNext()) {
reader.beginObject();
Role role = new Role();
while (reader.hasNext()) {
String nameRole = reader.nextName();
if (nameRole.equals("id")) {
role.setId(reader.nextString());
} else if (nameRole.equals("position"))
{ role.setPosition(reader.nextString());
} else if (nameRole.equals("salary")) {
role.setSalary(reader.nextString());
} else if (nameRole.equals("persons")) {
reader.beginArray();
while (reader.hasNext()) {
reader.beginObject();
Person person = new Person();
person.setRole(role.getId());
while (reader.hasNext()) {
String namePerson = reader.nextName();
if (namePerson.equals("id")) {
person.setId(reader.nextString());
} else if (namePerson.equals("name")) {
person.setName(reader.nextString());
}
}
persons.add(person);
reader.endObject();
}
reader.endArray();
}
}
roles.add(role);
reader.endObject();
}
reader.endArray();
}
}
reader.endObject();
reader.close();
} catch (IOException e) {
}
}
Καλούμε τον παραπάνω κωδικό στην τάξη XmlToJsonService.
JsonService jsonService = new JsonService(); List<Role> roles = new ArrayList<>(); List<Person> persons = new ArrayList<>(); jsonService.getDataFromJsonFile(filePathIn, roles, persons);
Πώς να μετατρέψετε το Json σε XML Java?
JSON σε XML in JAVA μετατρέπεται χρησιμοποιώντας JSONObject json = new JSONObject(str); Σειρά xml = XML. Εάν έχετε ένα έγκυρο αρχείο dtd ή το αρχείο xml, τότε είναι πολύ εύκολο να μετατρέψετε το json σε xml και επίσης το xml σε json.
Μετά πάμε στο επόμενο βήμα.
Μετατρέπω Java αντικείμενα σε μήνυμα XML χρησιμοποιώντας JAXB
Σε αυτό το βήμα, χρησιμοποιούμε την τεχνική Marshalling του JAXB.
Το Marshalling παρέχει σε μια εφαρμογή πελάτη τη δυνατότητα μετατροπής ενός προερχόμενου από JAXB Java δέντρο αντικειμένων σε δεδομένα XML.
Ορίζουμε τη συνάρτηση parseObjectToXm στο marshall Java αντικείμενο σε μήνυμα XML. Αυτή η συνάρτηση ορίζεται στην τάξη
XMLService.
public void parseObjectToXml(String filePath, XMLModel xmlModel) {
try {
JAXBContext contextObj = JAXBContext.newInstance(XMLModel.class);
Marshaller marshallerObj = contextObj.createMarshaller();
marshallerObj.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshallerObj.marshal(xmlModel, new FileOutputStream(filePath));
} catch (JAXBException je) {
System.out.println("JAXBException");
} catch (IOException ie) {
System.out.println("IOException");
}
}
Καλούμε τον παραπάνω κωδικό στην τάξη XmlToJsonService.
XMLService xmlService = new XMLService(); XMLModel xmlModel = new XMLModel(); Department department = new Department(); department.setRoles(roles); department.setPersons(persons); xmlModel.setDepartment(department); xmlService.parseObjectToXml(filePathOut, xmlModel);
Αυτή είναι η δεύτερη διαδικασία.
Συμπέρασμα
Σε αυτό το σεμινάριο, μάθαμε εν συντομία έναν τρόπο με τον οποίο το JAXB μπορεί να διαβάσει δεδομένα XML και ο Gson να τα γράψει σε JSON. Αντιθέτως, είδαμε και τον τρόπο που διάβαζε ο Γκσον JSON δεδομένα και το JAXB τα γράφουν σε XML.

