如何檢查 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 上獲取。