1. 概述
在本教程中,我們將學習如何檢查 JSON 數組並確認特定鍵是否存在以及它是否具有特定值。 我們將使用兩個最流行的 Java 庫來處理 JSON:Jackson 和 Gson。
2. 安裝配置
首先,讓我們創建一個 JSON 數組。我們將保持其簡潔,幷包含一個鍵值對的對象數組:
[
{
"key1": "value1"
},
{
"key2": "value2"
}
]
String exampleJson = "[{\"color\":\"red\"},{\"color\":\"blue\"},{\"color\":\"green\"}]";因此,數組中的每個對象都具有相同的屬性 color 及其不同的值。對於我們的示例,我們將檢查鍵 color 是否存在,其值為 green。
3. 使用 Jackson
為了在我們的項目中使用 Jackson,我們需要將其導入到我們的 <em >pom.xml</em> 中:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>最新版本可在 Maven 倉庫 中找到。
現在讓我們使用它來解決我們的問題:
@Test
void givenJsonArray_whenUsingJackson_thenDetectKeyInArray() throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode tree = objectMapper.readTree(exampleJson);
Stream<JsonNode> s = StreamSupport.stream(tree.spliterator(), false);
boolean result = s.map(entry -> entry.get("color"))
.filter(Objects::nonNull)
.anyMatch(color -> "green".equals(color.asText()));
assertTrue(result);
}我們的首要目標是解析 JSON。為此,我們使用了 ObjectMapper。我們使用 readTree() 方法將我們的 JSON String 轉換為 JsonNode。
隨後,我們把 JsonNode 轉換為 Stream。我們使用 StreamSupport 類(該類包含創建和處理 Stream 的一系列實用工具)來完成此操作。我們使用的具體實用工具是 stream() 方法,該方法接受一個 Spliterator 和一個 boolean 標誌。該標誌允許我們選擇使用順序流還是並行流。
之後,當我們的 Stream 準備就緒後,我們逐個檢查每個 JsonNode。在這裏,我們需要稍微小心一些。我們沒有確認我們的輸入 JSON 是否具有名為 color 的鍵。這可能會在將值轉換為字符串進行比較時導致 NullPointerException。
因此,首先,我們嘗試獲取屬性,然後過濾掉如果 JsonNode 沒有名為 color 的鍵,則可能發生的任何 null 值。一旦我們確信我們已經獲得了我們的值,我們就可以調用 anyMatch()。我們為它提供了一個謂詞,將每個值與我們選擇的顏色 green 進行比較。
anyMatch() 方法返回如果存在匹配項則為 true。因此,我們測試的末尾斷言表明,對於所選鍵 color,存在一個等於 green 的值。
4. 使用 Gson
接下來,我們將採用類似的方法,使用 Gson 庫。要將 Gson 集成到我們的項目中,我們需要將其導入到我們的 pom.xml 中:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.11.0</version>
</dependency>最新版本可在 Maven 倉庫 中找到。
我們將在此採用相同的計劃:解析我們的 JSON 字符串,將其轉換為 流,並使用 anyMatch() 來查找我們的值:
@Test
void givenJsonArray_whenUsingGson_thenDetectKeyInArray() {
Gson gson = new Gson();
JsonArray parsed = gson.fromJson(exampleJson, JsonArray.class);
Stream<JsonElement> s = StreamSupport.stream(parsed.spliterator(), false);
boolean result = s.map(entry -> entry.getAsJsonObject()
.get("color"))
.filter(Objects::nonNull)
.anyMatch(color -> "green".equals(color.getAsString()));
assertTrue(result);
}首先,我們使用 fromJson() 方法解析我們的 String,這返回了一個 JsonArray。 感謝第二個參數,我們可以在其中指定要解析 JSON 的類類型,從而獲得 JsonArray 類型。
接下來,其餘內容應該很熟悉。 我們像之前一樣,使用 StreamSupport 工具類來生成一個 Stream,其中包含 JsonElement 對象。 唯一的變動是我們需要在我們的 JsonElement 上調用 getAsJsonObject() 方法。 這允許我們檢索與 color 屬性關聯的值並將其與我們的 String 進行比較。
正如這裏再次所見,匹配成功地在 Stream 中找到。 值得注意的是,我們採取了與之前一樣,防止潛在的 NullPointerException,即 JSON 中沒有名為 color 的屬性的情況。 如果我們能對哪些屬性可用性有更多確定性,我們就可以直接跳到 anyMatch() 步驟。
5. 結論
在本文中,我們瞭解到可以使用 Jackson 和 Gson 兩種庫來檢查 JSON 數組中某個選定屬性的值是否存在。 兩種實現方式非常相似。 它們最終實現瞭解析 JSON、將其轉換為 Stream,然後使用 Stream 工具的流程來檢查匹配。 獲得 Stream 後,我們可以使用各種比較方法來評估數組中的條目,這使得該解決方案具有很高的靈活性。