1. 簡介
在本教程中,我們將探討如何將 Gson 的 <em >JsonArray</em> 轉換為 Java 中的 <em >HashMap</em>。 在本教程結束時,您將理解如何迭代 <em >JsonArray</em>、提取其元素並將其存儲在 <em >HashMap</em> 中。
2. 理解 Gson 中的 JsonArray 和 HashMap 結構
Gson 中的 JsonArray 是 Gson 庫的一部分,我們使用它來表示 JSON 元素的數組。以下是一個 JsonArray 的示例結構:
[
{"name": "John Doe", "age": 35},
{"name": "Mary Jenn", "age": 41}
]另一方面,HashMap 是一種存儲鍵值對的集合,其中每個鍵都映射到一個特定的值。 HashMap 中的每個鍵都必須是唯一的,這意味着不能有任何兩個鍵映射到同一個值。 如果我們嘗試添加一個重複的鍵,則新值將覆蓋與該鍵關聯的現有值。
3. 迭代方法
在這種方法中,我們手動遍歷 <em >JsonArray</em> 對象的每個元素,並使用從每個 <em >JsonObject</em> 中提取的鍵值對填充一個 <em >HashMap</em>:
Map<String, Integer> convertUsingIterative (JsonArray jsonArray) {
Map<String, Integer> hashMap = new HashMap<>();
for (JsonElement element : jsonArray) {
JsonObject jsonObject = element.getAsJsonObject();
String type = jsonObject.get("name").getAsString();
Integer amount = jsonObject.get("age").getAsInt();
hashMap.put(type, amount);
}
return hashMap;
}我們首先創建一個空的 HashMap,用於存儲結果的鍵值對。然後,我們遍歷每個 JsonArray 中的元素。 每個 JsonElement 都被轉換為 JsonObject,以便提取其字段。 當使用 Gson 時,數值通常以 JsonPrimitive 對象表示,其中包含 Number 實例。 在本例中,我們使用 getAsString() 和 getAsInt() 方法從 jsonObject 中提取 name 和 age 的值。
此外,為了驗證這種方法,我們可以創建一個測試用例,該用例構造一個樣本 JsonArray 並斷言預期的結果。
在運行測試之前,我們可以使用 @BeforeEach 註解設置一些測試數據。
@BeforeEach
void setUp() {
jsonArray = new JsonArray();
JsonObject jsonObject1 = new JsonObject();
jsonObject1.addProperty("name", "John Doe");
jsonObject1.addProperty("age", 35);
jsonArray.add(jsonObject1);
JsonObject jsonObject2 = new JsonObject();
jsonObject2.addProperty("name", "Mary Jenn");
jsonObject2.addProperty("age", 41);
jsonArray.add(jsonObject2);
}我們現在可以編寫一個測試用例,用於驗證將 JsonArray 轉換為 HashMap 的過程:
Map<String, Integer> hashMap = JSONArrayToHashMapConverter.convertUsingIterative(jsonArray);
assertEquals(35, hashMap.get("John Doe"));
assertEquals(41, hashMap.get("Mary Jenn"));這種方法對於需要精確控制每個元素的場景來説,既直觀又有效,尤其是在處理 JsonArray 時。
4. 流程式方法
第二種方法利用 Java Streams,允許我們以更具功能性和簡潔性的方式進行轉換。該方法高效地處理 JsonArray 中的每個元素,並將結果累積到 HashMap 中:
Map<String, Integer> convertUsingStreams (JsonArray jsonArray) {
return StreamSupport.stream(jsonArray.spliterator(), false)
.map(JsonElement::getAsJsonObject)
.collect(Collectors.toMap(
jsonObject -> jsonObject.get("name").getAsString(),
jsonObject -> jsonObject.get("age").getAsInt()
));
}我們首先從 JsonArray 創建一個流。 我們使用 StreamSupport.stream() 方法來實現這一點,該方法接受一個 Spliterator 用於 JsonArray 以及一個指示流是否應並行(在本例中為 false,用於順序處理)的標誌。
在 map() 函數中,每個 JsonElement 都被轉換為 JsonObject,從而允許我們從 JSON 對象中提取特定字段。 接下來,我們使用 collect() 方法與 Collectors.toMap() 一起收集這些 JsonObject 條目到 HashMap 中。
為了確保此方法正常工作,我們可以創建一個類似的測試用例:
Map<String, Integer> hashMap = JSONArrayToHashMapConverter.convertUsingStreams(jsonArray);
assertEquals(35, hashMap.get("John Doe"));
assertEquals(41, hashMap.get("Mary Jenn")); 我們可以使用這種方法高效地處理大型數據集,它也非常適合功能性編程愛好者。
5. 使用 fromJson() 方法
在最終方法中,我們利用 Gson 的 fromJson() 方法將 JsonArray 轉換為一個包含映射的列表。 這種方法利用 Gson 內置的功能來簡化轉換過程,然後將這些映射合併到一個 HashMap 中。
Map<String, Integer> convertUsingGson(JsonArray jsonArray) {
Map<String, Integer> hashMap = new HashMap<>();
Gson gson = new Gson();
List<Map<String, Object>> list = new Gson().fromJson(jsonArray, List.class);
for (Map<String, Object> entry : list) {
String type = (String) map.get("name");
Integer amount = ((Double) map.get("age")).intValue(); // Gson parses numbers as Double
hashMap.put(type, amount);
}
return hashMap;
}首先,我們使用 Gson 解析 JsonArray 並將其轉換為一系列 Map 對象。每個 Map 對象代表一個 JSON 對象,包含鍵值對。 我們遍歷列表中的每個 map 對象,提取 name 字段作為 String 類型,以及 age 字段作為 Double 類型。
此外,我們使用 intValue() 將 age 值轉換為 Integer 類型,因為 Gson 默認將數字解析為 Double 類型。 讓我們驗證我們的實現:
Map<String, Integer> hashMap = JSONArrayToHashMapConverter.convertUsingGson(jsonArray);
assertEquals(35, hashMap.get("John Doe"));
assertEquals(41, hashMap.get("Mary Jenn")); 6. 結論
在本文中,我們探討了三種將 Gson 的 JsonArray 轉換為 Java 中 HashMap 的方法。迭代方法適用於複雜的轉換,流式方法則非常適合高效地處理大型 JSON 數據集。相比之下,Gson 方法最適合處理簡單的轉換。