Рубрики
Без рубрики

Преобразование XML в JSON с помощью Jackson

Изучите различные способы, с помощью которых Джексон может читать XML-данные и записывать их в JSON.

Автор оригинала: baeldung.

1. Обзор

В этом уроке мы увидим, как преобразовать XML-сообщение в JSON с помощью Jackson.

Для читателей, впервые знакомых с Джексоном, подумайте о том, чтобы сначала ознакомиться с основами.

2. Введение в Джексона

Мы можем подумать о разборе JSON тремя различными способами с помощью Jackson:

  • Первым и наиболее распространенным является привязка данных с помощью ObjectMapper
  • Второй – сопоставление с древовидной структурой данных с помощью TreeTraversingParser и JsonNode
  • И третий – потоковая передача древовидной структуры данных по токену с использованием JsonParser и JsonGenerator

Теперь Джексон также поддерживает первые два для XML-данных. Таким образом, давайте посмотрим, как Джексон может помочь нам выполнить преобразование из одного формата в другой.

3. Зависимости

Во-первых, нам нужно добавить зависимость jackson-databind в ваш pom.xml :


    com.fasterxml.jackson.core
    jackson-databind
    2.11.1

Эта библиотека позволит нам использовать API привязки данных.

Второй – jackson-dataformat-xml , который добавляет поддержку XML Джексона:


    com.fasterxml.jackson.dataformat
    jackson-dataformat-xml
    2.11.1

4. Привязка данных

Проще говоря, привязка данных-это когда мы хотим сопоставить сериализованные данные непосредственно с объектом Java.

Чтобы изучить это, давайте определим наш XML с помощью Flower и Color properties :


    Poppy
    RED
    9

Это похоже на эту нотацию Java:

public class Flower {
    private String name;
    private Color color;
    private Integer petals;
    // getters and setters
}

public enum Color { PINK, BLUE, YELLOW, RED; }

Нашим первым шагом будет разбор XML на Flower экземпляр . Для этого давайте создадим экземпляр Xml Mapper , XML-эквивалент Джексона для ObjectMapper и используем его метод readValue :

XmlMapper xmlMapper = new XmlMapper();
Flower poppy = xmlMapper.readValue(xml, Flower.class);

Как только мы получим наши Цветок например, мы захотим записать его как JSON, используя знакомый ObjectMapper :

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(poppy);

И, в результате, мы получаем наш эквивалент JSON:

{
    "name":"Poppy",
    "color":"RED",
    "petals":9
}

5. Обход Дерева

Иногда прямой взгляд на древовидную структуру может обеспечить большую гибкость, например, в том случае, если мы не хотим поддерживать промежуточный класс или хотим преобразовать только часть структуры.

Хотя, как мы увидим, это связано с некоторыми компромиссами.

Первый шаг аналогичен нашему первому шагу, когда мы используем привязку данных. На этот раз, однако, мы будем использовать метод read Tree :

XmlMapper xmlMapper = new XmlMapper();
JsonNode node = xmlMapper.readTree(xml.getBytes());

Сделав это, мы получим JsonNode , у которого, как мы и ожидали, есть 3 ребенка: имя, цвет, и лепестки .

Затем мы снова можем использовать ObjectMapper , просто отправив вместо этого наш JsonNode :

ObjectMapper jsonMapper = new ObjectMapper();
String json = jsonMapper.writeValueAsString(node);

Теперь результат немного отличается по сравнению с нашим последним примером:

{
    "name":"Poppy",
    "color":"RED",
    "petals":"9"
}

При тщательном рассмотрении мы видим, что атрибут “лепестки” сериализуется в строку, а не в число! Это связано с тем, что readTree не выводит тип данных без явного определения.

5.1. Ограничения

Кроме того, существуют определенные ограничения с поддержкой обхода XML-дерева Джексона:

  • Джексон не может отличить объект от массива. Поскольку в XML отсутствуют собственные структуры, позволяющие отличить объект от списка объектов, Джексон просто сопоставит повторяющиеся элементы в одно значение.
  • И, поскольку Джексон хочет сопоставить каждый элемент XML с узлом JSON, он не поддерживает смешанный контент.

По этим причинам официальные документы Джексона рекомендуют не использовать древовидные модели для анализа XML .

6. Ограничения памяти

Теперь у обоих из них есть заметный недостаток, заключающийся в том, что весь XML должен находиться в памяти одновременно, чтобы выполнить преобразование. До тех пор, пока Джексон не поддержит потоковую передачу древовидной структуры в виде токенов, мы застрянем с этим ограничением или нам нужно будет взглянуть на прокатку наших собственных с помощью чего-то вроде XMLStreamReader .

7. Заключение

В этом уроке мы кратко изучили различные способы, с помощью которых Джексон может считывать XML-данные и записывать их в JSON. Кроме того, мы быстро рассмотрели ограничения каждого поддерживаемого подхода.

Как обычно, полный исходный код, сопровождающий учебник, доступен на GitHub .