Перетворення 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 та ДжонсWriter щоб забезпечити потокову обробку даних JSON.
- ДжонсWriter – Потоковий запис у JSON. Синтаксис загальної реалізації такий. Ми створюємо a ДжонсWriter об'єкт. Щоб розпочати та завершити створення рядка 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.

