知識庫 / XML RSS 訂閱

將JSON轉換為XML在Java中的實現

JSON,XML
HongKong
5
09:47 PM · Dec 05 ,2025

1. 概述

JSON 和 XML 是兩種流行的用於數據交換的格式。在實際應用中,我們經常需要在兩者之間進行轉換。

在本教程中,我們將探討在 Java 中將 JSON 轉換為 XML 的不同方法。

2. JSON-Java 庫

首先,JSON-Java 庫提供了一種簡單的方法將 JSON 轉換為 XML。

2.1. 依賴

讓我們先將 JSON-Java 依賴添加到我們的 pom.xml 中:

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20240303</version>
</dependency>

2.2. 代碼示例

我們可以使用測試用例來演示轉換過程。 讓我們創建一個測試用例,將 JSON 字符串轉換為 XML:

@Test
public void givenJsonString_whenConvertToXMLUsingJsonJava_thenConverted() {
    String jsonString = "{\"name\":\"John\", \"age\":20, \"address\":{\"street\":\"Wall Street\", \"city\":\"New York\"}}";
    JSONObject jsonObject = new JSONObject(jsonString);
    String xmlString = XML.toString(jsonObject);
    Assertions.assertEquals("<address><city>New York</city><street>Wall Street</street></address><name>John</name><age>20</age>", xmlString);
}

如我們所見,我們可以使用 XML.toString()方法將 JSON 字符串轉換為 XML。此方法接受一個 JSONObject對象作為參數,並返回一個 XML 字符串。然後我們斷言字符串與預期的一致。

此方法創建一個緊湊的 XML 字符串,其中每個鍵都轉換為 XML 標籤,值則為標籤的文本內容。

3. Jackson

Jackson 是一個流行的 Java JSON 庫。它還可以將 JSON 轉換為 XML。

3.1. 依賴

讓我們首先將 Jackson 依賴添加到我們的 pom.xml 中:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.17.2</version>
</dependency>

3.2. 代碼示例

接下來,我們將創建一個測試用例,使用 Jackson 將 JSON 字符串轉換為 XML:

@Test
public void givenJsonString_whenConvertToXMLUsingJackson_thenConverted() throws JsonProcessingException {
    String jsonString = "{\"name\":\"John\", \"age\":20, \"address\":{\"street\":\"Wall Street\", \"city\":\"New York\"}}";
    ObjectMapper objectMapper = new ObjectMapper();
    JsonNode jsonNode = objectMapper.readTree(jsonString);
    String xmlString = new XmlMapper().writeValueAsString(jsonNode);
    Assertions.assertEquals("<ObjectNode><name>John</name><age>20</age><address><street>Wall Street</street><city>New York</city></address></ObjectNode>", xmlString);
}

如我們所見,我們可以使用 XmlMapper 類將 JSON 字符串轉換為 XML。該類包含一個 writeValueAsString() 方法,它接受一個 JsonNode 對象作為參數,並返回一個 XML 字符串。此外,輸出標籤被包裹在 ObjectNode 標籤中。

3.3. 自定義輸出

在之前的示例中,我們看到輸出的 XML 字符串未進行格式化,缺少 XML 聲明,根標籤為 ObjectNode。由於這與 XML 標準不符,我們可以自定義輸出以使其更具可讀性和符合標準。

讓我們為 XmlMapper 對象添加一些配置選項,以自定義輸出:

@Test
public void givenJsonString_whenConvertToXMLUsingJacksonWithXMLDeclarationAndRoot_thenConverted() throws JsonProcessingException {
    String jsonString = "{\"name\":\"John\", \"age\":20, \"address\":{\"street\":\"Wall Street\", \"city\":\"New York\"}}";
    ObjectMapper objectMapper = new ObjectMapper();
    JsonNode jsonNode = objectMapper.readTree(jsonString);
    
    XmlMapper xmlMapper = new XmlMapper();
    xmlMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
    xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
    xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_1_1, true);
    
    String xmlString = xmlMapper.writer().withRootName("root").writeValueAsString(jsonNode);
    
    Assertions.assertEquals("<?xml version='1.1' encoding='UTF-8'?>" + System.lineSeparator() +
      "<root>" + System.lineSeparator() +
      " <name>John</name>" + System.lineSeparator() +
      " <age>20</age>" + System.lineSeparator() +
      " <address>" + System.lineSeparator() +
      " <street>Wall Street</street>" + System.lineSeparator() +
      " <city>New York</city>" + System.lineSeparator() +
      " </address>" + System.lineSeparator() +
      "</root>" + System.lineSeparator(), xmlString);
}

在這裏,我們添加了幾個配置選項到 XmlMapper 對象:

  • SerializationFeature.INDENT_OUTPUT 將輸出的 XML 字符串縮進,使其更易於閲讀
  • ToXmlGenerator.Feature.WRITE_XML_DECLARATION 添加 XML 聲明到輸出的 XML 字符串中
  • ToXmlGenerator.Feature.WRITE_XML_1_1 將 XML 版本 1.1 添加到 XML 聲明中
  • withRootName() 將根標籤名稱設置為 root,而不是 ObjectNode

正如我們所見,輸出的 XML 字符串現在已格式化,具有 XML 聲明,並且根標籤為 root

4. 使用 Underscore-java

Underscore-java 是一套實用工具庫,提供將 JSON 轉換為 XML 的方法。 值得注意的是,它需要 Java 11 或更高版本才能正常工作

在 Jackson 示例中,我們需要為 XmlMapper 對象添加一些配置選項,以根據 XML 標準自定義輸出。 Underscore-java 默認遵循 XML 標準,因此不需要這些配置選項。

4.1. 依賴

讓我們首先將 Underscore-java 依賴添加到我們的 pom.xml 中:

<dependency>
    <groupId>com.github.javadev</groupId>
    <artifactId>underscore-java</artifactId>
    <version>1.89</version>
</dependency>

4.2. 代碼示例

接下來,讓我們創建一個測試用例,使用 Underscore-java 將 JSON 字符串轉換為 XML:

@Test
public void givenJsonString_whenConvertToXMLUsingUnderscoreJava_thenConverted() {
    String jsonString = "{\"name\":\"John\", \"age\":20}";
    String xmlString = U.jsonToXml(jsonString);
    Assertions.assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
      "<root>\n" +
      "  <name>John</name>\n" +
      "  <age number=\"true\">20</age>\n" +
      "</root>", xmlString);
}

如我們所見,我們可以使用 U.jsonToXml()方法將 JSON 字符串轉換為 XML。

它還添加根元素和聲明到 XML 字符串中。與其它庫不同,輸出默認格式化以提高可讀性。

對於所有非字符串字段,它會在標籤中添加類型屬性。例如,它會在 age元素中添加 number屬性。

這使得更容易將 XML 字符串解析回 JSON(如果需要)。

如果不需要屬性,可以使用 U.JsonToXmlMode.REMOVE_ATTRIBUTES選項進行禁用:

@Test
public void givenJsonString_whenConvertToXMLUsingUnderscoreJavaWithoutAttributes_thenConverted() {
    String jsonString = "{\"name\":\"John\", \"age\":20}";
    String xmlString = U.jsonToXml(jsonString, U.JsonToXmlMode.REMOVE_ATTRIBUTES);
    Assertions.assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
      "<root>\n" +
      "  <name>John</name>\n" +
      "  <age>20</age>\n" +
      "</root>", xmlString);
}

如我們所見,number 屬性不再添加到 age 元素中。

5. 結論

在本文中,我們探討了在 Java 中將 JSON 轉換為 XML 的各種方法。我們還分析了一些測試用例,以幫助理解轉換過程。

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

發佈 評論

Some HTML is okay.