將 JsonNode 對象轉換為 Map
一、簡介
在現代軟件開發中,不同系統之間的數據交換是常見的需求。 JSON(JavaScript 對象表示法)是一種流行的數據交換格式。 JSON 的主要目的是通過網絡連接在服務器和 Web 應用程序之間高效地發送有組織的數據。它充當此數據傳輸的便捷格式。
此外,JSON 經常用於 Web 服務和 API,以一致且標準化的方式提供公共數據。它的靈活性使得能夠與各種編程語言、平台和技術順利集成。
處理 JSON 時最常見的 Java 編程任務之一是將由JsonNode表示的 JSON 對象轉換為Map結構,以便於操作和訪問。
在本教程接下來的部分中,我們將探索並演示使用 Jackson 和 Gson 庫將JsonNode對象轉換為Map的兩種方法。
2. 概述
將JsonNode轉換為Map是一種將 JSON 數據表示為具有鍵和值的結構的方法,類似於字典,其中鍵是字符串,值可以是其他 JSON 元素或簡單數據類型。具體來說,這種轉換對於開發人員特別有用,因為它允許他們使用熟悉的 Java Map和List接口來處理 JSON 數據,使數據操作更加簡單直觀。
在我們的示例場景中,我們有一個名為jsonString的 Java 字符串,它保存 JSON 格式的數據結構,創建一個具有各種屬性的 JSON 對象,例如“ id ”、“ name ”、“ email ”、“ age ”、“ address ”、“ skills ”和“ isActive ”。
String jsonString = "{\"id\": 123456, \"name\": \"John Doe\", \"email\": \"[email protected]\", " +
"\"age\": 30, \"address\": { \"street\": \"123 Main St\", \"city\": \"New York\", " +
"\"country\": \"USA\" }, \"skills\": [ \"Java\", \"Python\", \"JavaScript\" ], \"isActive\": true }";
以下是 JSON 對象的細分:
{
"id": 123456,
"name": "John Doe",
"email": "[email protected]",
"age": 30,
"address": {
"street": "123 Main St",
"city": "New York",
"country": "USA"
},
"skills": ["Java", "Python", "JavaScript"],
"isActive": true
}
為了實現將此jsonString轉換為 Java Map ,我們將使用兩個流行的 Java 庫:Jackson 和 Gson。這些庫提供了易於使用的方法來處理 JSON 數據序列化和反序列化。
2. 使用傑克遜圖書館
Jackson 是一個廣泛使用的 Java 庫,它使 JSON 數據的處理變得輕而易舉。它為解析和序列化 JSON 提供強大的支持。
要使用 Jackson,我們首先將其依賴項添加到pom.xml文件中:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.15.2</version>
</dependency>
添加所需的依賴項後,我們將使用 Jackson 中的ObjectMapper類將JsonNode轉換為 Java Map :
@Test
public void givenJsonData_whenUsingJackson_thenConvertJsonNodeToMap() throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(jsonString);
Map<String, Object> map = objectMapper.convertValue(jsonNode, Map.class);
Assert.assertEquals(123456, map.get("id"));
Assert.assertEquals("John Doe", map.get("name"));
Assert.assertEquals("[email protected]", map.get("email"));
Assert.assertEquals(30, map.get("age"));
Map<String, Object> address = (Map<String, Object>) map.get("address");
Assert.assertEquals("123 Main St", address.get("street"));
Assert.assertEquals("New York", address.get("city"));
Assert.assertEquals("USA", address.get("country"));
List<String> skills = (List<String>) map.get("skills");
Assert.assertEquals("Java", skills.get(0));
Assert.assertEquals("Python", skills.get(1));
Assert.assertEquals("JavaScript", skills.get(2));
Assert.assertEquals(true, map.get("isActive"));
}
代碼首先創建一個ObjectMapper實例,該實例負責讀取和寫入 JSON 數據。然後,使用readTree()方法將提供的 JSON 字符串轉換為JsonNode對象。此外, convertValue()方法將JsonNode轉換為Map<String, Object> ,從而可以使用鍵值對輕鬆訪問 JSON 數據。
然後,代碼執行一系列斷言來驗證提取的值,檢查預期值是否與轉換後的Map中的值匹配。 JSON 結構中的嵌套對象通過將相應的值轉換為Map<String, Object>訪問,而列表則通過將它們轉換為List<String>來訪問。最終斷言驗證與isActive鍵關聯的值。
總的來說,代碼說明了我們如何使用 Jackson 的ObjectMapper將 JSON 數據轉換為Map並執行數據驗證。
3.使用Gson庫
Gson 是 Java 中另一個流行的 JSON 處理庫。它提供了一個簡單而靈活的 API,用於將 JSON 轉換為 Java 對象。
要使用 Gson 將JsonNode對象轉換為Map ,首先,我們應該將Gson依賴項添加到pom.xml文件中:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
接下來,我們將編寫一個測試方法,利用 Gson 庫將JsonNode轉換為 Java Map :
@Test
public void given_JsonData_whenUsingGson_thenConvertJsonNodeToMap() {
JsonElement jsonElement = JsonParser.parseString(jsonString);
Gson gson = new Gson();
Map<String, Object> map = gson.fromJson(jsonElement, Map.class);
assertEquals(123456, ((Number) map.get("id")).intValue());
assertEquals("John Doe", map.get("name"));
assertEquals("[email protected]", map.get("email"));
assertEquals(30, ((Number) map.get("age")).intValue());
Map<String, Object> address = (Map<String, Object>) map.get("address");
assertEquals("123 Main St", address.get("street"));
assertEquals("New York", address.get("city"));
assertEquals("USA", address.get("country"));
List<String> skills = (List<String>) map.get("skills");
assertEquals("Java", skills.get(0));
assertEquals("Python", skills.get(1));
assertEquals("JavaScript", skills.get(2));
assertEquals(true, map.get("isActive"));
}
根據上述測試方法,使用Gson中的JsonParser類來解析JSON字符串並將其轉換為JsonElement對象。然後,創建一個Gson實例以從JsonElement轉換為Map<String, Object> 。
該代碼包含多個斷言,用於驗證轉換後的Map是否包含預期值。例如,它檢查與鍵id關聯的值是否等於 123456,以及與鍵name關聯的值是否等於John Doe 。
可以通過將Map中的相應值轉換為Map<String, Object>來訪問address對象,例如地址對象。類似地, skills數組可以通過將其值轉換為List<String>來訪問。與前面的示例一樣,添加了一個新斷言來確認與鍵isActive關聯的值是否等於true 。
此代碼演示了 Gson 庫將JsonNode轉換為 Java Map並對提取的值執行斷言的能力。
4。結論
在 Java 中處理 JSON 數據時,將JsonNode對象轉換為Map是一個常見要求。我們可以使用 Jackson 或 Gson 等庫輕鬆執行此轉換。
在本教程中,我們提供了詳細的示例以及測試用例,以演示使用 Jackson 和 Gson 庫將JsonNode對象轉換為Map的過程。通過應用這些示例,我們可以有效地處理 JSON 數據並對其進行操作。
與往常一樣,本文的完整代碼示例可以在 GitHub 上找到。