將 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 上找到。