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 |
我们的第一步将是将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 |
结果,我们得到了等效的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 |
现在,结果与我们上一个示例相比略有不同:
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上获得。