使用Jackson将XML转换为JSON

Convert XML to JSON Using Jackson

1.概述

在本教程中,我们将看到如何使用Jackson将XML消息转换为JSON。

对于杰克逊新手来说,请考虑先熟悉基础知识。

2.杰克逊简介

我们可以考虑用Jackson的三种不同方式来解析JSON:

  • 第一个也是最常见的是与ObjectMapper进行数据绑定

  • 第二个是使用TreeTraversingParser和JsonNode映射到树数据结构

  • 第三是使用JsonParser和JsonGenerator通过令牌流传输树数据结构

  • 现在,Jackson还支持XML数据的前两个。这样,让我们??看看Jackson如何帮助我们完成从一种格式到另一种格式的转换。

    3.依存关系

    首先,我们需要将jackson-databinddependency添加到我们的pom.xml中:

    1
    2
    3
    4
    5
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        jackson-databind</artifactId>
        <version>2.9.7</version>
    </dependency>

    该库将允许我们使用数据绑定API。

    第二个isjackson-dataformat-xml添加了Jackson的XML支持:

    1
    2
    3
    4
    5
    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        jackson-dataformat-xml</artifactId>
        <version>2.9.7</version>
    </dependency>

    4.数据绑定

    简而言之,数据绑定是当我们希望将序列化数据直接映射到Java对象时。

    为了探索这一点,让我们使用FlowerandColor属性定义XML:

    1
    2
    3
    4
    5
    <Flower>
        <name>Poppy</name>
        <color>RED</color>
        <petals>9</petals>
    </Flower>

    这类似于以下Java符号:

    1
    2
    3
    4
    5
    6
    7
    8
    public class Flower {
        private String name;
        private Color color;
        private Integer petals;
        // getters and setters
    }

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

    我们的第一步将是将XML解析为aFlower实例。为此,让我们创建XmlMapper的实例,它是Jackson的ObjectMapper的XML等效项,并使用其readValue方法:

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

    一旦有了Flower实例,我们将要使用熟悉的ObjectMapper将其写为JSON:

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

    结果,我们得到了等效的JSON:

    1
    2
    3
    4
    5
    {
       "name":"Poppy",
       "color":"RED",
       "petals":9
    }

    5.树木遍历

    有时,直接查看树结构可以提供更大的灵活性,例如在我们不想维护中间类或只想转换结构的一部分的情况下。

    但是,正如我们将看到的,它需要进行一些折衷。

    第一步类似于我们使用数据绑定时的第一步。不过,这一次,我们将使用readTree方法:

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

    完成此操作后,我们将有一个JsonNode,它具有3个子节点,这与我们预期的一样:名称,颜色和花瓣。

    然后,我们可以再次使用ObjectMapper,只需发送我们的JsonNode即可:

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

    现在,结果与我们上一个示例相比略有不同:

    1
    2
    3
    4
    5
    {
       "name":"Poppy",
       "color":"RED",
       "petals":"9"
    }

    仔细检查后,我们可以看到花瓣属性被序列化为字符串而不是数字!这是因为readTree不会在没有显式定义的情况下推断数据类型。

    5.1。局限性

    而且,Jackson的XML树遍历支持有某些限制:

  • Jackson无法区分对象和数组。由于XML缺乏本机结构,无法将对象与对象列表区分开,因此Jackson只会将重复的元素整理为单个值。

  • 而且,由于Jackson希望将每个XML元素映射到JSON节点,因此它不支持混合内容。

  • 由于这些原因,Jackson官方文档建议不要使用Tree模型来解析XML。

    6.内存限制

    现在,这两个都具有明显的缺点,即整个XML需要立即存储在内存中才能执行转换。直到Jackson支持将树结构作为令牌流式传输,否则我们将陷入这种约束中,否则我们将需要让我们看看使用XMLStreamReader之类的东西滚动自己的东西。

    7.结论

    在本教程中,我们简要学习了Jackson读取XML数据并将其写入JSON的不同方法。此外,我们快速浏览了每种受支持方法的局限性。

    与往常一样,该教程随附的完整源代码可在GitHub上获得。