1. 概述
在本教程中,我們將學習如何使用 Jackson 將 XML 消息轉換為 JSON。
對於初次接觸 Jackson 的讀者,請先熟悉一下基本概念。
2. Jackson 簡介
我們可以用三種不同的方式來解析 JSON,使用 Jackson:- 第一種,也是最常見的方式,是使用數據綁定,即 ObjectMapper
- 第二種是將其映射到樹狀數據結構,即使用 TreeTraversingParser 和 JsonNode
- 而第三種是按樹狀數據結構的令牌進行流式傳輸,即使用 JsonParser 和 JsonGenerator
現在,Jackson 還支持前兩種對 XML 數據。因此,讓我們看看 Jackson 如何幫助我們進行一種格式到另一種格式的轉換。
3. 依賴項
首先,我們需要將 jackson-databind 依賴項添加到我們的 pom.xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.2</version>
</dependency>
這個庫將允許我們使用數據綁定 API。
第二個是 jackson-dataformat-xml,它添加了 Jackson 的 XML 支持:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.17.2</version>
</dependency>
4. 數據綁定
數據綁定,簡單來説,是指我們希望將序列化數據直接映射到 Java 對象。
為了探索這一點,Flower and Colorproperties">讓我們定義我們的 XML,包含 Flower 和 Color 屬性。
<Flower>
<name>Poppy</name>
<color>RED</color>
<petals>9</petals>
</Flower>
這與以下 Java 表達式相似:
public class Flower {
private String name;
private Color color;
private Integer petals;
// getters and setters
}
public enum Color { PINK, BLUE, YELLOW, RED; }
Flower instance">我們的第一步是將 XML 解析為 Flower 實例。
XmlMapper xmlMapper = new XmlMapper();
Flower poppy = xmlMapper.readValue(xml, Flower.class);
Flower instance, we’ll want to write it out as JSON using the familiar ObjectMapper: 我們已經獲得了 Flower 實例,接下來,我們想使用熟悉的 ObjectMapper 將其寫入 JSON:
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(poppy);
並且,作為結果,我們得到 JSON 對應的內容:
{
"name":"Poppy",
"color":"RED",
"petals":9
}
5. 樹遍歷
儘管如此,正如我們稍後所看到的那樣,它也伴隨着一些權衡。
第一步與我們使用數據綁定時類似。但這次,我們將使用
XmlMapper xmlMapper = new XmlMapper();
JsonNode node = xmlMapper.readTree(xml.getBytes());
完成此操作後,我們將擁有一個
然後,我們可以再次使用
ObjectMapper jsonMapper = new ObjectMapper();
String json = jsonMapper.writeValueAsString(node);
{
"name":"Poppy",
"color":"RED",
"petals":"9"
}
5.1. 限制
並且,Jackson 的樹遍歷支持存在一些限制:
因此,官方 Jackson 文檔建議不要使用 Tree 模型來解析 XML。
6. 內存限制
現在,這兩個方法都有一個顯著的缺點,即整個XML需要在內存中一次性存在,才能進行轉換。 在Jackson支持將樹結構作為令牌進行流式處理之前,我們將被困在這個限制下,或者需要像XMLStreamReader一樣自行實現。
7. 結論
在本教程中,我們簡要學習了 Jackson 可以讀取 XML 數據和將其寫入 JSON 的不同方法。 此外,我們還快速瞭解了每種支持的方法的侷限性。