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 .