使用 findValue() 取得 Jackson 中嵌套鍵的值
1. 概述
在 Java 中使用 JSON 通常需要存取巢狀鍵。 Jackson 是一個受歡迎的 JSON 處理庫,它提供了一種使用findValue()
方法來實現此目的的便捷方法。
在本教程中,我們將探索使用findValue()
方法來檢索巢狀鍵的值。
2. 理解 JSON 中的巢狀鍵
JSON 物件可以具有巢狀結構,這使得存取深度巢狀的值變得困難:
{
"user": {
"id": 1,
"name": "John Doe",
"contact": {
"email": "[email protected]",
"phone": "123-456-7890"
}
}
}
在此 JSON 中, email
金鑰會嵌套在contact
物件中,而聯絡人物件又會嵌套在user
物件中。
3.使用findValue()
方法
Jackson 中的findValue()
方法允許我們在 JSON 樹中搜尋特定鍵並檢索其關聯值。
首先,我們將使用ObjectMapper
將 JSON 字串轉換為JsonNode
,建立 JSON 資料的樹表示形式:
String jsonString = "{ \"user\": { \"id\": 1, \"name\": \"John Doe\", \"contact\": { \"email\": \"[email protected]\", \"phone\": \"123-456-7890\" } } }";
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(jsonString);
然後我們可以使用findValue()
方法在 rootNode 中搜尋email
金鑰rootNode:
String email = rootNode.findValue("email").asText();
assertEquals("[email protected]", email);
這裡我們使用asText()
將包含email
的JsonNode
轉換為字串。
4. 優雅地處理遺失的鑰匙
在使用 JSON 時,我們可能會遇到缺少金鑰的情況。當在 JSON 結構中找不到鍵時, findValue()
方法傳回null
。
考慮以下 JSON,其中缺少email
金鑰:
String jsonString = "{ \"user\": { \"id\": 1, \"name\": \"John Doe\", \"contact\": { \"phone\": \"123-456-7890\" } } }";
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(jsonString);
JsonNode emailNode = rootNode.findValue("email");
在此範例中, findValue(“email”)
傳回null
因為電子郵件金鑰不在 JSON 中。此外,我們可以透過斷言emailNode
為null
來驗證這一點:
assertNull(emailNode);
5. 對數組使用findValue()
方法
findValue()
方法也適用於 JSON 中的陣列:
{
"users": [
{ "id": 1, "name": "John Doe", "contact": { "email": "[email protected]" } },
{ "id": 2, "name": "Jane Doe", "contact": { "email": "[email protected]" } }
]
}
讓我們解析 JSON 字串:
String jsonString = "{ \"users\": [ { \"id\": 1, \"name\": \"John Doe\", \"contact\": { \"email\": \"[email protected]\" } }, { \"id\": 2, \"name\": \"Jane Doe\", \"contact\": { \"email\": \"[email protected]\" } } ] }";
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(jsonString);
然後,我們使用findValues()
搜尋所有出現的email
金鑰:
List<String> emails = rootNode.findValues("email")
.stream()
.map(JsonNode::asText)
.collect(Collectors.toList());
assertThat(emails)
.containsExactly("[email protected]", "[email protected]");
此處, findValues()
方法傳回包含電子郵件地址的JsonNode
物件清單。然後我們將這些節點轉換為字串並將它們收集到一個清單中,並檢查它是否具有正確順序的預期電子郵件地址。
6. 處理深度嵌套的鍵
我們可以使用at()
方法將深度嵌套的 JSON 結構中的欄位定位到特定路徑,而不是透過名稱在 JSON 結構中的某個位置尋找鍵。
讓我們考慮以下 JSON:
{
"organization": {
"department": {
"team": {
"lead": {
"name": "Alice",
"contact": {
"email": "[email protected]"
}
}
}
}
}
}
為了檢索團隊負責人的電子郵件地址,我們先將 JSON 字串解析為JsonNode
:
String jsonString = "{ \"organization\": { \"department\": { \"team\": { \"lead\": { \"name\": \"Alice\", \"contact\": { \"email\": \"[email protected]\" } } } } } }";
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(jsonString);
然後我們使用at()
方法來瀏覽嵌套結構:
String email = rootNode.at("/organization/department/team/lead/contact/email").asText();
assertEquals("[email protected]", email);
這裡,提供給at()
方法的路徑是一個JSON Pointer ,這是使用字串語法瀏覽 JSON 文件的標準化方法。
七、結論
Jackson 的findValue()
方法提供了一種強大且靈活的方法來檢索 JSON 中巢狀鍵的值。
無論是處理深度嵌套的物件還是數組, findValue()
都簡化了流程並增強了程式碼的可讀性和可維護性。但是,對於欄位的精確位置,我們可以使用帶有 JSON 路徑的at()
函數。
像往常一樣,我們可以在 GitHub 上找到完整的原始碼和範例。