Conversão XML para JSON usando Jackson

Conversão XML para JSON usando Jackson

1. Visão geral

Neste tutorial, veremos como converter uma mensagem XML em JSON usando Jackson.

Para leitores novos em Jackson, considere se familiarizar comthe basics primeiro.

2. Uma introdução a Jackson

Podemos pensar em analisar o JSON de três maneiras diferentes com Jackson:

Agora, Jackson também oferece suporte aos dois primeiros para dados XML. Como tal, vamos ver como Jackson pode nos ajudar a fazer a conversão de um formato para outro.

3. Dependências

Primeiro, precisamos adicionar a dependênciajackson-databind ao nossopom.xml:


    com.fasterxml.jackson.core
    jackson-databind
    2.9.7

Essa biblioteca nos permitirá usar a API de ligação de dados.

O segundo éjackson-dataformat-xml, que adiciona suporte XML de Jackson:


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

4. Ligação de dados

A vinculação de dados, simplesmente, é quando queremos mapear dados serializados diretamente para um objeto Java.

Para explorar isso,let’s define our XML with Flower and Color properties:


    Poppy
    RED
    9

Isso é semelhante a esta notação 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. Para fazer isso, vamos criar uma instância deXmlMapper, o XML de Jackson equivalente paraObjectMappere usar seu métodoreadValue :

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

Assim que tivermos nossa instânciaFlower, queremos escrevê-la como JSON usando o familiarObjectMapper:

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

E, como resultado, obtemos nosso equivalente JSON:

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

5. Tree Traversal

Às vezes, olhar diretamente para a estrutura em árvore pode oferecer mais flexibilidade, como no caso de não querermos manter uma classe intermediária ou querermos apenas converter uma parte da estrutura.

Porém, como veremos, isso traz algumas desvantagens.

O primeiro passo é semelhante ao primeiro quando usamos a ligação de dados. Desta vez, porém, usaremos o métodoreadTree:

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

Feito isso, teremos umJsonNode que tem 3 filhos, como esperávamos:name, color,epetals.

Então, podemos usar novamenteObjectMapper, apenas enviando nossoJsonNode instead:

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

Agora, o resultado é ligeiramente diferente em comparação com nosso último exemplo:

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

Após uma inspeção cuidadosa, podemos ver que o atributo pétalas é serializado em uma string em vez de um número!  Isso ocorre porquereadTree não infere o tipo de dados sem uma definição explícita.

5.1. Limitações

E, existem certas limitações com o suporte para passagem de árvore XML de Jackson:

  • Jackson cannot differentiate between an Object and an Array. Como o XML carece de estruturas nativas para distinguir um objeto de uma lista de objetos, Jackson simplesmente agrupará elementos repetidos em um único valor.

  • E, uma vez que Jackson deseja mapear cada elemento XML para um nó JSON, ele não suporta conteúdo misto.

6. Restrições de memória

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. Até que Jackson ofereça suporte ao streaming da estrutura de árvore como tokens, ficaremos presos a esta restrição ou precisaremos dar uma olhada em fazer o nosso próprio com algo comoXMLStreamReader.

7. Conclusão

Neste tutorial, aprendemos brevemente diferentes maneiras pelas quais Jackson pode ler dados XML e gravá-los no JSON. Além disso, analisamos rapidamente as limitações de cada abordagem suportada.

Como de costume, o código-fonte completo que acompanha o tutorial está disponívelover on GitHub.