知識庫 / Java Map RSS 訂閱

如何將 Gson JsonArray 轉換為 HashMap

Java Map,JSON
HongKong
5
09:42 PM · Dec 05 ,2025

1. 簡介

在本教程中,我們將探討如何將 Gson 的 <em >JsonArray</em> 轉換為 Java 中的 <em >HashMap</em>。 在本教程結束時,您將理解如何迭代 <em >JsonArray</em>、提取其元素並將其存儲在 <em >HashMap</em> 中。

2. 理解 Gson 中的 JsonArrayHashMap 結構

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 中提取 nameage 的值。

此外,為了驗證這種方法,我們可以創建一個測試用例,該用例構造一個樣本 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 方法最適合處理簡單的轉換。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.