使用 Jackson 將 XML 轉換為 JSON

Jackson,XML
Remote
0
10:31 PM · Nov 30 ,2025

1. 概述

在本教程中,我們將學習如何使用 Jackson 將 XML 消息轉換為 JSON。

對於初次接觸 Jackson 的讀者,請先熟悉一下基本概念。

2. Jackson 簡介我們可以用三種不同的方式來解析 JSON,使用 Jackson:

第一種,也是最常見的方式,是使用數據綁定,即 ObjectMapper 第二種是將其映射到樹狀數據結構,即使用 TreeTraversingParserJsonNode 而第三種是按樹狀數據結構的令牌進行流式傳輸,即使用 JsonParserJsonGenerator

現在,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. 樹遍歷

在某些情況下,直接查看樹結構可以提供更大的靈活性,例如當我們不想維護中間類或只想轉換結構的一部分時。

儘管如此,正如我們稍後所看到的那樣,它也伴隨着一些權衡。

第一步與我們使用數據綁定時類似。但這次,我們將使用 readTree 方法:

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

完成此操作後,我們將擁有一個 JsonNode,它有 3 個子節點:name, color, petals

然後,我們可以再次使用 ObjectMapper,只需將我們的 JsonNode 發送過去:

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

現在,結果與我們上一個示例略有不同:

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

仔細檢查後,我們可以看到 petals 屬性被序列化為字符串,而不是數字! 這是因為 readTree 在沒有明確定義的情況下不推斷數據類型。

5.1. 限制

並且,Jackson 的樹遍歷支持存在一些限制:

  • Jackson 無法區分對象和數組。 由於 XML 缺乏原生結構來區分對象和對象列表,Jackson 將重複元素簡單地合併為一個值。
  • 並且,由於 Jackson 想要將每個 XML 元素映射到 JSON 節點,因此不支持混合內容。

    因此,官方 Jackson 文檔建議不要使用 Tree 模型來解析 XML

    6. 內存限制

    現在,這兩個方法都有一個顯著的缺點,即整個XML需要在內存中一次性存在,才能進行轉換。 在Jackson支持將樹結構作為令牌進行流式處理之前,我們將被困在這個限制下,或者需要像XMLStreamReader一樣自行實現。

    7. 結論

    在本教程中,我們簡要學習了 Jackson 可以讀取 XML 數據和將其寫入 JSON 的不同方法。 此外,我們還快速瞭解了每種支持的方法的侷限性。

  • user avatar
    0 位用戶收藏了這個故事!
    收藏

    發佈 評論

    Some HTML is okay.