Учебники

52) Конвертируйте JSON в XML, используя Gson и JAXB

Что такое JSON?

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

В следующем примере мы определяем строку JSON, в которой хранится личная информация:

{
"username" : "guru99user",
"email" : "[email protected]"	
}

Так что синтаксис JSON очень прост. Каждая информация о данных будет состоять из двух частей: ключа и значения, которые соответствуют имени поля и его значению в определенной записи. Но, если посмотреть дальше, есть несколько таких вещей:

  • Строка JSON заключена в фигурные скобки {}.
  • Ключи и значения JSON должны быть заключены в кавычки {"}.
  • Если данных больше (больше пар ключ => значение), мы используем запятые (,) для разделения.
  • Ключи JSON должны быть беззнаковыми буквами или цифрами _, без пробелов, первый символ не должен быть установлен на цифры.

В этом уроке вы узнаете

Что такое XML?

XML означает расширяемый язык разметки, также называемый расширяемым языком разметки, предложенный Консорциумом World Wide Web ( http://www.w3.org/ ) для создания других языков разметки. Это простое подмножество, которое может описывать множество различных типов данных, поэтому оно очень полезно для обмена данными между системами.

Теги в XML часто не предопределены, но они создаются в соответствии с пользовательскими соглашениями. XML вводит новые функции, основанные на преимуществах HTML.

В различных системах и решениях есть еще несколько полезных функций создания XML:

  • XML расширяем: XML позволяет создавать собственные теги в соответствии с вашим приложением.
  • XML переносит данные, а не отображает их: XML позволяет хранить данные независимо от того, как они будут отображаться.
  • XML является общим стандартом: XML был разработан Консорциумом World Wide Web (W3C) и доступен в качестве открытого стандарта.

XML построен на структуре вложенных узлов. Каждый узел будет иметь открывающий тег и закрывающий тег следующим образом:

<node>content</node>

В котором:

  • <узел> - это открытый тег, имя этого тега определяется вами.
  • </ node> - закрытый тег, имя этого тега должно совпадать с именем открытого тега.
  • content - это содержимое этого тега.

В верхней части каждого 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, мы используем функции 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 Streaming обрабатывает быстро. Однако вам нужно обрабатывать каждую пару (ключ => значение) обработки данных JSON.

Что такое JAXB?

JAXB расшифровывается как Java Architecture for XML Binding, библиотека, которая использует аннотации для преобразования объектов Java в контент XML и наоборот. Поскольку JAXB определяется через спецификацию, мы можем использовать разные реализации для этого стандарта.

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

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

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

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

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

Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

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

Marshaller marshallerObj = jaxbContext.createMarshaller();

Начальная настройка

Мы реализуем пример преобразования XML - JSON на платформу:

  • Откройте JDK 8 для Ubuntu 18.04 x64.
  • Eclipse IDE 2019-03 (4.11.0) x64 Разработка Java для Ubuntu.
  • Гсон 2.8.5.

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

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

Шаг 2 . Задайте имя проекта XmlToJsonExample .

Установить название проекта.

Шаг 3 . Создайте папку data / input, содержащую два файла sample.xml и sample.json .

Создать папку данных / ввода.

Давайте сначала определим наш 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 . Определите соответствующие классы объектов в модели пакета .

Определите классы объектов.
  • 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.

Добавьте библиотеку 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);

Тогда мы идем к следующему шагу.

Преобразование объектов Java в сообщение XML с использованием JAXB

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

Marshalling предоставляет клиентскому приложению возможность преобразовывать производное 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. Напротив, мы также видели, как Gson читает данные JSON, а JAXB записывает их в XML.

Эта статья предоставлена ​​Дэвидом Говардом