Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> java

Конвертация 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).

Частые аннотации:

Настройка проекта

  1. Создайте Java-проект в вашей IDE (например, Eclipse).
  2. Назовите его XmlToJsonExample.
  3. Добавьте папку data/input с sample.xml и sample.json.
  4. Подключите Gson 2.8.5 в build path.
  5. Добавьте 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();
}

Полный рабочий процесс конвертации

  1. Анмаршаллинг sample.xml в XMLModel с помощью JAXB.
  2. Сериализация полученных Java-объектов в sample.json через Gson.
  3. Десериализация sample.json обратно в Java-объекты.
  4. Маршаллинг этих объектов в новый XML-файл.

Заключение

Это руководство демонстрирует чистый двухшаговый конвейер конвертации: JAXB обрабатывает XML ↔ Java, а Gson — JSON ↔ Java. Комбинируя эти библиотеки, разработчики могут надежно трансформировать данные между форматами в Java-приложениях.

java

  1. Классы и объекты в C++: практическое руководство с примерами кода
  2. Java Hello World: пошаговое руководство по написанию первой программы
  3. Метод String.length() в Java: как получить длину строки (пример)
  4. Понимание String.charAt() в Java: синтаксис, возвращаемый тип, исключения и пример
  5. Метод String.contains() в Java: как проверить наличие подстроки — примеры
  6. Освоение String.endsWith() в Java: проверка суффиксов строки с примерами
  7. Чтение файлов в Java с BufferedReader — Практическое руководство с примерами
  8. Генерация последовательности Фибоначчи в Java: примеры for, while и рекурсии
  9. Алгоритм сортировки вставками в Java: понятный пример и пошаговое руководство
  10. Сортировка выбором в Java: пошаговый пример и полный код