在 Java 中將 JSON 轉換為 XML
一、概述
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>20230227</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 是一個流行的 Java JSON 庫。它還可用於將 JSON 轉換為 XML。
3.1.依賴性
讓我們從將Jackson依賴項添加到我們的pom.xml
開始:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.14.1</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("\n" +
"
"
"
" \n" +
"
"
" \n" +
"
}`
在這裡,我們向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. 使用下劃線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。
它還將**root
元素和聲明添加到 XML 字符串。**與其他庫不同,輸出的格式默認為可讀性。
對於所有非字符串字段,它向標籤添加類型屬性。例如,它將number
屬性添加到age
元素。這使得在需要時更容易將 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 的不同方法。我們還查看了一些測試用例以了解轉換。
與往常一樣,代碼示例在 GitHub 上可用。