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

Что такое JSON?

JSON — это аббревиатура для Javascript Object Notation, представляющая собой форму данных, которая следует определенному правилу, которое в настоящее время доступно для чтения большинству языков программирования. Мы можем легко сохранить его в файл или записать в базу данных. Формат 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"?>

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

Гсон (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 Archiтектура для XML Binding, которая представляет собой библиотеку, использующую аннотации для преобразования Java объекты в содержимое XML и наоборот. Поскольку JAXB определен в спецификации, мы можем использовать различные реализации этого стандарта.

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

  • @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) x64 Java Разработка для 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 в производные от JAXB данные. Java объекты.

Мы определяем функцию 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.

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