如何檢查 JSON 數組中是否存在特定鍵的值
1. 概述
在本教程中,我們將學習如何檢查 JSON 數組並確認特定鍵是否存在以及它是否具有特定值。我們將使用兩個最流行的 Java 庫來處理 JSON:Jackson 和 Gson。
2. 設置
首先,我們創建一個 JSON 數組。我們將保持簡單,並擁有一個對像數組,每個對像都有一個鍵/值對:
String exampleJson = "[{\"color\":\"red\"},{\"color\":\"blue\"},{\"color\":\"green\"}]";
因此,數組中的每個對像都具有相同的屬性color和不同的值。對於我們的示例,我們將檢查鍵color的值green是否存在。
3.利用傑克遜
要在我們的項目中使用 Jackson,我們需要將其導入到pom.xml中:
<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 和並行Stream之間進行選擇。
之後,在Stream準備就緒後,我們依次檢查每個JsonNode 。我們在這裡需要稍微小心一點。我們無法確認我們的輸入 JSON 具有任何名為color的鍵。將值轉換為String進行比較時,這可能會導致NullPointerException 。
因此,首先,我們嘗試獲取該屬性,然後進行過濾以刪除在JsonNode沒有名為 color 的鍵時可能出現的任何null color.一旦我們確信我們有自己的價值,我們就可以調用anyMatch() 。我們給它一個謂詞,將每個值與我們選擇的green.
如果存在匹配,則anyMatch()方法返回true 。因此,我們在測試結束時的斷言表明,所選關鍵color有一個等於green的值。
4.使用Gson
接下來,我們將使用 Gson 庫採取非常類似的方法。要在我們的項目中使用 Gson,我們需要將其導入到pom.xml中:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
最新版本可在Maven 存儲庫中找到。
我們將在這裡應用相同的計劃來解析 JSON String ,將其轉換為Stream ,並使用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 。由於第二個參數,我們獲得了JsonArray類型,我們可以在其中指定要將 JSON 解析為的類。
完成該步驟後,其餘部分應該看起來很熟悉。我們像以前一樣使用StreamSupport實用程序來生成JsonElement Stream 。唯一的其他變化是我們需要在JsonElement上調用getAsJsonObject() 。這使我們能夠檢索與color屬性關聯的值並將其與String進行比較。
從這裡再次可以看到,在Stream中成功找到了匹配項。值得注意的是,我們採取了與之前相同的預防措施,防止由於 JSON 中沒有名為color屬性而導致潛在的NullPointerException 。如果我們能夠更加確定哪些屬性可用,我們可以直接跳到anyMatch()步驟。
5. 結論
在本文中,我們看到可以使用 Jackson 和 Gson 來檢查 JSON 數組中所選屬性是否存在值。兩種實現都是相似的。他們最終實現了解析 JSON、將其轉換為Stream,然後最終使用Stream實用程序來檢查匹配。一旦我們有了Stream,我們就可以使用任意數量的比較方法來評估數組中的條目,從而使其成為一種通用的解決方案。
與往常一樣,示例的完整代碼可在 GitHub 上獲取。