Конвертировать XML в JSON, используя Джексона

Конвертировать XML в JSON, используя Джексона

1. обзор

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

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

2. Знакомство с Джексоном

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

  • Первый и самый распространенный - это привязка данных сObjectMapper

  • Второй - отображение в древовидной структуре данных сTreeTraversingParser иJsonNode

  • И третий - это потоковая передача структуры данных дерева по токенам с использованиемJsonParser иJsonGenerator.

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

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

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


    com.fasterxml.jackson.core
    jackson-databind
    2.9.7

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

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


    com.fasterxml.jackson.dataformat
    jackson-dataformat-xml
    2.9.7

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

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

Чтобы изучить это,let’s define our XML with Flower and 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; }

Our first step will be to parse the XML into a Flower instance. Для этого давайте создадим экземплярXmlMapper, XML-эквивалент Джексона дляObjectMapper, и воспользуемся его методомreadValue :

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

Когда у нас есть экземплярFlower, нам нужно записать его как JSON, используя знакомыйObjectMapper:

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

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

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

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

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

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

Первый шаг похож на наш первый шаг, когда мы используем привязку данных. Однако на этот раз мы воспользуемся методомreadTree:

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

Сделав это, у нас будетJsonNode, у которого, как мы и ожидали, 3 потомка:name, color, иpetals.

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

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

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

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

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

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

И есть определенные ограничения с поддержкой обхода дерева XML Джексона:

  • Jackson cannot differentiate between an Object and an Array. Поскольку в XML отсутствуют собственные структуры, позволяющие отличить объект от списка объектов, Джексон просто сопоставляет повторяющиеся элементы в одно значение.

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

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

Now, both of these have the notable downside that the entire XML needs to be in memory at once in order to perform the conversion. До тех пор, пока Джексон не поддержит потоковую передачу древовидной структуры в виде токенов, мы будем застрять с этим ограничением или нам нужно будет взглянуть на то, чтобы свести собственное с чем-то вродеXMLStreamReader.

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

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

Как обычно, доступен полный исходный код, прилагаемый к руководствуover on GitHub.