Конвертация JSON в XML в Java с Gson и JAXB — пошаговое руководство
Что такое JSON?
JSON (JavaScript Object Notation) — легковесный, язык-независимый формат данных, использующий пары ключ-значение. Он широко принят для обмена данными и легко хранится в файлах или базах данных.
{ "username": "guru99user", "email": "guru99user@mail.com" }
Ключевые характеристики:
- Заключен в фигурные скобки {}.
- Ключи и строковые значения в кавычках.
- Пары разделены запятыми.
- Ключи используют буквы, цифры, подчеркивание; нет ведущих цифр или пробелов.
Что такое XML?
XML (eXtensible Markup Language) — W3C-стандарт для структурированных данных. В отличие от HTML, XML чисто формат данных — без визуального рендеринга. Он позволяет кастомные теги, делая его идеальным для кросс-системного обмена данными.
Типичная структура узла:
<node>content</node>
В начале XML-файла нужно объявить версию:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Что такое Gson?
Gson — Java-библиотека, сериализующая Java-объекты в JSON и десериализующая JSON обратно в Java-объекты. С v1.6 также поддерживает стриминг через JsonReader и JsonWriter.
Пример стримингового писателя:
JsonWriter writer = new JsonWriter(new FileWriter(filePath));
writer.beginObject();
writer.name("key").value("value");
writer.endObject();
writer.close();
Что такое JAXB?
JAXB (Java Architecture for XML Binding) маппит Java-классы в XML с помощью аннотаций. Поддерживает маршаллинг (Java → XML) и анмаршаллинг (XML → Java).
Частые аннотации:
@XmlRootElement— определяет корневой XML-элемент.@XmlElementWrapper— оборачивает коллекции.@XmlElement— маппит поле в XML-элемент.@XmlAttribute— маппит поле в XML-атрибут.
Настройка проекта
- Создайте Java-проект в вашей IDE (например, Eclipse).
- Назовите его XmlToJsonExample.
- Добавьте папку
data/inputсsample.xmlиsample.json. - Подключите Gson 2.8.5 в build path.
- Добавьте JAXB API (обычно в комплекте с Java 8).
Пример данных
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> </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> </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"}]} ] }
Java-модели классов
Определите следующие POJO в пакете model:
/* Role.java */
@XmlRootElement(name = "role")
public class Role {
private String id, position, salary;
// геттеры, сеттеры с аннотациями @XmlAttribute/@XmlElement
}
/* Person.java */
@XmlRootElement(name = "person")
public class Person {
private String id, name, role;
// геттеры, сеттеры с аннотациями @XmlAttribute/@XmlElement
}
/* Department.java */
@XmlRootElement(name = "department")
public class Department {
private List<Role> roles;
private List<Person> persons;
// геттеры/сеттеры с @XmlElementWrapper/@XmlElement
}
/* XMLModel.java */
@XmlRootElement(name = "root")
public class XMLModel {
private Department department;
// геттер/сеттер с @XmlElement
}
Анмаршаллинг XML в Java-объекты (JAXB)
public XMLModel getObjectFromXmlFile(String path) throws JAXBException {
File file = new File(path);
JAXBContext ctx = JAXBContext.newInstance(XMLModel.class);
Unmarshaller um = ctx.createUnmarshaller();
return (XMLModel) um.unmarshal(file);
}
Маршаллинг Java-объектов в XML (JAXB)
public void parseObjectToXml(String path, XMLModel model) throws JAXBException, IOException {
JAXBContext ctx = JAXBContext.newInstance(XMLModel.class);
Marshaller m = ctx.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(model, new FileOutputStream(path));
}
Сериализация Java-объектов в JSON (Gson)
public void writeDataToJsonFile(String path, List<Role> roles, List<Person> persons) throws IOException {
JsonWriter writer = new JsonWriter(new FileWriter(path));
writer.setIndent(" ");
writer.beginObject();
writer.name("roles").beginArray();
for (Role r : roles) {
writer.beginObject();
writer.name("id").value(r.getId());
writer.name("position").value(r.getPosition());
writer.name("salary").value(r.getSalary());
writer.name("persons").beginArray();
for (Person p : persons) if (p.getRole().equals(r.getId())) {
writer.beginObject();
writer.name("id").value(p.getId());
writer.name("name").value(p.getName());
writer.endObject();
}
writer.endArray();
writer.endObject();
}
writer.endArray();
writer.endObject();
writer.close();
}
Десериализация JSON в Java-объекты (Gson)
public void getDataFromJsonFile(String path, List<Role> roles, List<Person> persons) throws IOException {
JsonReader reader = new JsonReader(new FileReader(path));
reader.beginObject();
while (reader.hasNext()) {
String rootName = reader.nextName();
if ("roles".equals(rootName)) {
reader.beginArray();
while (reader.hasNext()) {
reader.beginObject();
Role r = new Role();
while (reader.hasNext()) {
String key = reader.nextName();
switch (key) {
case "id": r.setId(reader.nextString()); break;
case "position": r.setPosition(reader.nextString()); break;
case "salary": r.setSalary(reader.nextString()); break;
case "persons":
reader.beginArray();
while (reader.hasNext()) {
reader.beginObject();
Person p = new Person();
p.setRole(r.getId());
while (reader.hasNext()) {
String pKey = reader.nextName();
if ("id".equals(pKey)) p.setId(reader.nextString());
else if ("name".equals(pKey)) p.setName(reader.nextString());
}
persons.add(p);
reader.endObject();
}
reader.endArray();
}
}
roles.add(r);
reader.endObject();
}
reader.endArray();
}
}
reader.endObject();
reader.close();
}
Полный рабочий процесс конвертации
- Анмаршаллинг
sample.xmlвXMLModelс помощью JAXB. - Сериализация полученных Java-объектов в
sample.jsonчерез Gson. - Десериализация
sample.jsonобратно в Java-объекты. - Маршаллинг этих объектов в новый XML-файл.
Заключение
Это руководство демонстрирует чистый двухшаговый конвейер конвертации: JAXB обрабатывает XML ↔ Java, а Gson — JSON ↔ Java. Комбинируя эти библиотеки, разработчики могут надежно трансформировать данные между форматами в Java-приложениях.
java
- Классы и объекты в C++: практическое руководство с примерами кода
- Java Hello World: пошаговое руководство по написанию первой программы
- Метод String.length() в Java: как получить длину строки (пример)
- Понимание String.charAt() в Java: синтаксис, возвращаемый тип, исключения и пример
- Метод String.contains() в Java: как проверить наличие подстроки — примеры
- Освоение String.endsWith() в Java: проверка суффиксов строки с примерами
- Чтение файлов в Java с BufferedReader — Практическое руководство с примерами
- Генерация последовательности Фибоначчи в Java: примеры for, while и рекурсии
- Алгоритм сортировки вставками в Java: понятный пример и пошаговое руководство
- Сортировка выбором в Java: пошаговый пример и полный код