Перетворення 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 Проект

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

Крок 3) Створіть папку.
Створити папку дані/введення містить два файли 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) Визначити об'єкт.
Визначте відповідні класи об’єктів у пакеті модель.

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

Перетворити повідомлення 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.