Преобразование JSON в XML Java с использованием Gson и JAXB с примером

Что такое JSON?

JSON — это аббревиатура от нотации объектов Javascript, которая представляет собой форму данных, соответствующую определенному правилу, согласно которому большинство языков программирования в настоящее время читабельны. Мы можем легко сохранить его в файл или записать в базу данных. Формат JSON использует пары ключ-значение для описания данных.

В дальнейшемwing В этом примере мы определяем строку 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"?>

Что такое Гсон?

Гсон (https://github.com/google/gson) — это библиотека Java, которая позволяет пользователям преобразовывать объект Java в строку JSON, а также преобразовывать строку JSON в объект Java. Gson может работать с произвольными объектами Java, включая существующие объекты, без необходимости предоставления вам их исходного кода.

Начиная с версии 1.6, Gson представляет два новых класса: JsonReader и JsonWriter для обеспечения потоковой обработки данных JSON.

  • JsonWriter – Потоковая запись в JSON. Синтаксис для общей реализации следующий. Мы создаем JsonWriter объект. Чтобы начать и закончить создание строки JSON, мы используем функцию начатьОбъект() и КонечныйОбъект(). В середине выполнения этих двух функций мы выполняем запись данных парами (ключ => значение).
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 для привязки XML, которая представляет собой библиотеку, которая использует аннотации для преобразования объектов Java в содержимое XML и наоборот. Поскольку JAXB определен в спецификации, мы можем использовать различные реализации этого стандарта.

С JAXB мы часто используем следующуюwing основные аннотации, а именно:

  • @XmlRootElement: эта аннотация определяет внешний тег XML-файла и поэтому объявляется поверх класса.
  • @XmlElementWrapper: эта аннотация создает элемент XML-обертки вокруг коллекций.
  • @XmlElement: эта аннотация, используемая для объявления атрибута объекта, является тегом XML-файла.
  • @XmlАтрибут: Эта аннотация также используется для объявления атрибута объекта тегом XML-файла.

Синтаксис для общей реализации следующий. Сначала мы инициализируем JAXBContext объект с МойОбъект объект для преобразования.

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

В этом JAXBContext объект, у него есть метод для создания объекта, который преобразует содержимое XML в объект Java, Демаршаллер.

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) Разработка Java x64 для Ubuntu.
  • Гсон 2.8.5.

Шаг 1) Создать проект.
Создайте новый Java-проект.

Создайте новый Java-проект.
Создайте новый Java-проект.

Шаг 2) Установите имя проекта.
Установить имя проекта XmlToJsonExample.

Установить имя проекта

Установите имя проекта.

Шаг 3) Создайте папку.
Создать папку ввод данных содержащий два файла образец.xml и образец.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;
	}
}
  • Человек.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;
	}
}
  • Департамент.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;
	}
}

XMLМодель.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

Во-первых, мы определяем производительность, классифицированную в пакете обслуживание.

Определить исполнительские классы

Дайте определение исполнительским классам.

На первом этапе первого процесса мы используем технику демаршаллинга JAXB.

Демаршалинг предоставляет клиентскому приложению возможность преобразовывать данные 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

На этом этапе мы определяем функцию записьдататоджсонфиле для записи данных в файл JSON. Эта функция определена в классе JsonService.

Обратите внимание, что для записи списка строк JSON мы используем функцию начатьArray() и КонецArray(). Между этими двумя функциями мы записываем каждую строку 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 мы используем функцию начатьArray() и КонецArray(). Между этими двумя функциями мы читаем каждую строку 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

На этом этапе мы используем технику маршаллинга JAXB.

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