如何將 Gson JsonArray 轉換為 HashMap
一、簡介
在本教程中,我們將探討如何在 Java 中將 Gson JsonArray
轉換為HashMap
。在本教程結束時,我們將了解迭代JsonArray
、提取其元素並將它們儲存在HashMap
中的過程。
2.了解Gson JsonArray
和HashMap
結構
Gson JsonArray
是 Gson 函式庫的一部分,我們用它來表示 JSON 元素的陣列。這是JsonArray
的範例結構:
[
{"name": "John Doe", "age": 35},
{"name": "Mary Jenn", "age": 41}
]
另一方面, HashMap
是儲存鍵值對的集合,其中每個鍵對應到特定值。 HashMap
中的每個鍵必須是唯一的,這意味著沒有兩個鍵可以映射到相同的值。如果我們嘗試新增重複的鍵,新值將覆蓋與該鍵關聯的現有值。
3. 迭代方法
在這個方法中,我們手動迭代JsonArray
物件的每個元素,並使用從每個JsonObject
提取的鍵值對填入HashMap
:
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 時,數值通常表示為包含Number
實例的JsonPrimitive
物件。在此範例中,我們分別使用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()
方法來實現這一點,該方法採用JsonArray
的Spliterator
和指示流是否應該並行的標誌(在本例中,對於順序處理為 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 物件。我們迭代列表中的每個地圖對象,並將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 "));
六,結論
在本文中,我們探討了在 Java 中將 Gson JsonArray
轉換為HashMap
三種方法。迭代方法對於複雜的轉換非常有用,流方法非常適合高效處理大型 JSON 資料集。相較之下,Gson 方法最適合直接轉換。
與往常一樣,範例的原始程式碼可在 GitHub 上取得。