1. 介紹
在現代軟件開發中,不同系統之間的數據交換是一個常見的需求。JSON(JavaScript Object Notation)是一種流行的數據交換格式。JSON的主要目的是通過網絡連接高效地在服務器和 Web 應用程序之間傳輸結構化數據。它作為這種數據傳輸的便捷格式。
此外,JSON 經常被用於 Web 服務和 API 中,以提供一致且標準化的公共數據。其靈活性使其能夠與各種編程語言、平台和技術無縫集成。
在處理 JSON 時,最常見的 Java 編程任務之一是將 JSON 對象(表示為 <em >JsonNode</em >>)轉換為 <em >Map</em >> 結構,以便於操作和訪問。
在接下來的教程部分,我們將探索和演示使用 Jackson 和 Gson 庫將 <em >JsonNode</em >> 對象轉換為 <em >Map</em >> 的兩種方法。
2. 概述
將 JsonNode 轉換為 Map 是一種將 JSON 數據表示為具有鍵和值的結構的方式,類似於字典,其中鍵為字符串,值可以是其他 JSON 元素或基本數據類型。 具體來説,這種轉換對開發者特別有用,因為它允許他們使用熟悉的 Java Map 和 List 接口來處理 JSON 數據,從而使數據操作更加直觀和易於理解。
在我們的示例場景中,我們有一個 Java 字符串 jsonString,它包含一個 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 庫
Jackson 是一個廣泛使用的 Java 庫,它使得處理 JSON 數據變得非常簡單。它提供了強大的解析和序列化 JSON 的支持。
要使用 Jackson,首先將它的 依賴項 添加到我們的 pom.xml 文件中:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.16.0</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 數據。然後,提供的 JSON 字符串使用 readTree() 方法轉換為 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 對象。
要將 JsonNode 對象轉換為 Gson 中的 Map,首先需要在 pom.xml 文件中添加 Gson 依賴項:
<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。
嵌套對象,如 address 對象,可以通過將 Map 中相應的值轉換為 Map<String, Object> 來訪問。 同樣,通過將 skills 數組的值轉換為 List<String> 來訪問該數組。 類似於之前的示例,添加了一個新的斷言來確認與鍵 isActive 關聯的值是否等於 true。
此代碼演示了 Gson 庫將 JsonNode 轉換為 Java Map 及其在提取值上執行斷言的能力。
4. 結論
將一個 <em >JsonNode</em > 對象轉換為 `Map> 是在 Java 中處理 JSON 數據時常見的需求。我們可以通過使用像 Jackson 或 Gson 這樣的庫輕鬆地執行此轉換。
在本教程中,我們提供了詳細的示例以及測試用例,以演示如何使用 Jackson 和 Gson 庫將 <em >JsonNode</em >> 對象轉換為Map>。通過應用這些示例,我們可以高效地處理 JSON 數據並對其進行操作。