Конвертирайте XML в JSON с помощта на Jackson

1. Общ преглед

В този урок ще видим как да конвертирате XML съобщение в JSON с помощта на Jackson.

За нови читатели на Джаксън, помислете първо да се запознаят с основите.

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

Можем да мислим за синтактичен анализ на JSON по три различни начина с Джаксън:

  • Първото и най-често срещано е свързването на данни с 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 поддръжка на Jackson:

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

4. Обвързване на данни

Обвързването на данни, най-просто казано, е когато искаме да картографираме сериализирани данни директно към обект на Java.

За да проучим това, нека дефинираме нашия XML със свойства на цветя и цвят :

 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 . За да направим това, нека създадем екземпляр на XmlMapper , XML еквивалент на Jackson за 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 деца, както очаквахме: име, цвят и листенца .

След това можем отново да използваме ObjectMapper , просто изпращайки вместо това нашия JsonNode :

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

Сега резултатът е малко по-различен в сравнение с последния ни пример:

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

След внимателна проверка можем да видим, че атрибутът венчелистчета е сериализиран в низ вместо в число! Това е така, защото readTree не извежда типа данни без изрична дефиниция.

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

И има определени ограничения с поддръжката на XML дърво за обръщане на Джаксън:

  • Джаксън не може да прави разлика между обект и масив. Тъй като на XML липсват естествени структури за разграничаване на обект от списък с обекти, Джаксън просто ще събере повтарящите се елементи в една стойност.
  • И тъй като Джаксън иска да свърже всеки XML елемент с JSON възел, той не поддържа смесено съдържание.

Поради тези причини официалните документи на Jackson препоръчват да не се използват модели на Tree за синтактичен анализ на XML.

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

Сега и двете имат забележителния недостатък, че целият XML трябва да бъде наведнъж в паметта, за да извърши преобразуването. Докато Джаксън не поддържа стрийминг на дървесната структура като символи, ние ще се придържаме към това ограничение или ще трябва да разгледаме своето собствено търкаляне с нещо като XMLStreamReader.

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

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

Както обикновено, пълният изходен код, който придружава урока, е достъпен в GitHub.