Μετατρέψτε JSON σε XML Java χρησιμοποιώντας Gson και JAXB με Παράδειγμα

Τι είναι το JSON;

Το JSON είναι μια συντομογραφία του Javascript Object Notation, η οποία είναι μια μορφή δεδομένων που ακολουθεί έναν ορισμένο κανόνα που είναι επί του παρόντος οι περισσότερες γλώσσες προγραμματισμού readable. Μπορούμε εύκολα να το αποθηκεύσουμε σε ένα αρχείο ή να καταγράψουμε στη βάση δεδομένων. Η μορφή JSON χρησιμοποιεί ζεύγη κλειδιών-τιμών για την περιγραφή δεδομένων.

Στη συνέχειαwing Στο παράδειγμα, ορίζουμε μια συμβολοσειρά JSON που αποθηκεύει προσωπικές πληροφορίες:

{
"username" : "guru99user",
"email" : "guru99user@mail.com"	
}

Άρα η σύνταξη του JSON είναι πολύ απλή. Κάθε πληροφορία δεδομένων θα έχει δύο μέρη: κλειδί και τιμή που αντιστοιχούν στο όνομα του πεδίου και στην τιμή του σε μια συγκεκριμένη εγγραφή. Αλλά κοιτάζοντας περαιτέρω, υπάρχουν μερικά πράγματα όπως αυτό:

  • Η συμβολοσειρά JSON περικλείεται από σγουρά άγκιστρα {}.
  • Τα κλειδιά και οι τιμές του JSON πρέπει να περικλείονται σε εισαγωγικά {“}.
  • Εάν υπάρχουν περισσότερα δεδομένα (περισσότερα ζεύγη κλειδιών => τιμών), χρησιμοποιούμε κόμματα (,) για να διαχωρίσουμε.
  • Τα κλειδιά JSON πρέπει να είναι ανυπόγραφα γράμματα ή numbers, _ και χωρίς κενά, ο πρώτος χαρακτήρας δεν πρέπει να οριστεί σε numbers.

Τι είναι το XML;

Η XML σημαίνει επεκτάσιμη γλώσσα σήμανσης που ονομάζεται επίσης επεκτάσιμη γλώσσα σήμανσης που προτείνεται από την Κοινοπραξία του Παγκόσμιου Ιστού (https://www.w3.org/) για να δημιουργήσετε άλλες γλώσσες σήμανσης. Αυτό είναι ένα απλό υποσύνολο που μπορεί να περιγράψει πολλούς διαφορετικούς τύπους δεδομένων, επομένως είναι πολύ χρήσιμο για την κοινή χρήση δεδομένων μεταξύ συστημάτων.

Οι ετικέτες στο XML συχνά δεν είναι προκαθορισμένες, αλλά δημιουργούνται σύμφωνα με τις συμβάσεις του χρήστη. XML εισάγει νέες δυνατότητες βασισμένες στα πλεονεκτήματα της HTML.

Υπάρχουν μερικές πιο χρήσιμες δυνατότητες δημιουργίας XML σε διάφορα συστήματα και λύσεις:

  • Η XML είναι επεκτάσιμη: Η XML σάς επιτρέπει να δημιουργήσετε τις δικές σας προσαρμοσμένες ετικέτες που ταιριάζουν στην εφαρμογή σας.
  • Η XML μεταφέρει δεδομένα, δεν τα εμφανίζει: Η XML σάς επιτρέπει να αποθηκεύετε δεδομένα ανεξάρτητα από το πώς θα εμφανιστούνyed.
  • Η 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, χρησιμοποιούμε συχνά το following βασικοί σχολιασμοί, και συγκεκριμένα:

  • @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.

Δημιουργήστε ένα νέο έργο Java.
Δημιουργήστε ένα νέο έργο Java.

Βήμα 2) Ορισμός ονόματος έργου.
Ορισμός Όνομα έργου είναι Παράδειγμα XmlToJson.

Ορισμός ονόματος έργου

Ορισμός ονόματος έργου.

Βήμα 3) Δημιουργήστε ένα φάκελο.
Δημιουργία φακέλου εισαγωγή δεδομένων που περιέχει δύο αρχεία δείγμα.xml και δείγμα.json.

Δημιουργία δεδομένων φακέλου

Δημιουργία δεδομένων/εισόδου φακέλου.

Ας ορίσουμε πρώτα το XML μας με τμήμα, ρόλος και person ιδιότητες.

Ο γενικός archiη τεχνολογία είναι: ; .

Σχέσεις αντικειμένων

Σχέσεις αντικειμένων.

<?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 Build Path.

Ρύθμιση της βιβλιοθήκης Gson

Προσθέστε τη βιβλιοθήκη Gson 2.8.5 στο Java Build Path

Προσθέστε τη βιβλιοθήκη Gson 2.8.5 στο Java Build Path.

Μετατροπή μηνύματος XML σε αντικείμενα Java χρησιμοποιώντας JAXB

Αρχικά, ορίζουμε την απόδοση σε ταξινομημένη συσκευασία υπηρεσία.

Καθορίστε τάξεις εκτέλεσης

Καθορίστε τάξεις εκτέλεσης.

Στο πρώτο βήμα της πρώτης διαδικασίας, χρησιμοποιούμε την τεχνική Un-marshalling του JAXB.

Το Un-marshalling παρέχει σε μια εφαρμογή πελάτη τη δυνατότητα να μετατρέπει δεδομένα XML σε αντικείμενα Java που προέρχονται από JAXB.

Ορίζουμε τη συνάρτηση getObjectFromXmlFile για να καταργήσουμε το αρχείο XML σε ένα αντικείμενο 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 παρέχει σε μια εφαρμογή πελάτη τη δυνατότητα να μετατρέψει ένα δέντρο αντικειμένων Java που προέρχεται από JAXB σε δεδομένα XML.

Ορίζουμε τη συνάρτηση parseObjectToXm για να προσαρμόσουμε το αντικείμενο 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.