Перетворення 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, яка дозволяє користувачам конвертувати з a Java об’єкт у рядок JSON, а також конвертувати з рядка JSON у Java об'єкт. Gson може працювати з довільними Java об’єкти, включаючи існуючі об’єкти без їх вихідного коду.

Починаючи з версії 1.6, Gson представляє два нових класи – JsonReader та JsonWriter щоб забезпечити потокову обробку даних JSON.

  • JsonWriter – Потоковий запис у JSON. Синтаксис загальної реалізації такий. Ми створюємо a JsonWriter об'єкт. Щоб розпочати та завершити створення рядка JSON, ми використовуємо функцію beginObject() та 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 for XML Binding, яка є бібліотекою, яка використовує анотації для перетворення Java об’єктів у вміст XML і навпаки. Оскільки JAXB визначається через специфікацію, ми можемо використовувати різні реалізації цього стандарту.

З JAXB ми часто використовуємо наступні основні анотації, а саме:

  • @XmlRootElement: Ця анотація вказує, що таке зовнішній тег XML-файлу, і тому він оголошується поверх класу.
  • @XmlElementWrapper: Ця анотація створює обгортку XML-елемент навколо колекцій.
  • @XmlElement: ця анотація, яка використовується для оголошення атрибута об’єкта, є тегом файлу XML.
  • @XmlAttribute: ця анотація, яка також використовується для оголошення атрибута об’єкта, є тегом файлу XML.

Синтаксис загальної реалізації такий. Спочатку ми ініціалізуємо JAXBContext об'єкт за допомогою МійОб'єкт об'єкт для перетворення.

JAXBContext jaxbContext = JAXBContext.newInstance(MyObject.class);

В цьому JAXBContext об’єкт, він має метод для створення об’єкта, який перетворює вміст XML у a Java об'єкт, Unmarshaller.

Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

В цьому JAXBContext об’єкт, він має метод для створення об’єкта, який перетворює 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) Встановіть назву проекту.
Встановіть назву проекту XmlToJsonExample.

Встановіть назву проекту

Встановіть назву проекту.

Крок 3) Створіть папку.
Створити папку дані/введення містить два файли sample.xml та sample.json.

Створення даних папки

Створити папку data/input.

Давайте спочатку визначимо наш XML за допомогою відділ, роль та людина властивості.

Загальна архітектура: ; .

Об'єктні зв'язки

Об'єктні зв'язки.

<?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) Визначити об'єкт.
Визначте відповідні класи об’єктів у пакеті модель.

Визначити класи об’єктів

Визначити класи об’єктів.

  • Роль.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 Побудувати шлях.

Налаштувати бібліотеку Gson

Додайте бібліотеку Gson 2.8.5 Java Побудувати шлях

Додайте бібліотеку 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.

Маршалінг надає клієнтській програмі можливість перетворювати похідний JAXB Java дерево об’єктів у дані 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 data і JAXB записують їх у XML.