使用 findValue() 獲取嵌套鍵的值(Jackson)

Jackson
Remote
0
06:41 PM · Nov 30 ,2025

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 對象內,而 contact 對象又嵌套在 user 對象內。

3. 使用  findValue() 方法

Jackson 中的 findValue() 方法允許我們在 JSON 樹中搜索特定的鍵並檢索其關聯的值。

首先,我們將 JSON 字符串轉換為 JsonNode,使用 ObjectMapper,創建一個 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 鍵:

String email = rootNode.findValue("email").asText();
assertEquals("[email protected]", email);

這裏我們使用了 asText() 方法將包含 emailJsonNode 轉換為字符串。

4. 優雅處理缺失鍵

在處理JSON時,我們可能會遇到鍵丟失的情況。 findValue() 方法在鍵未在JSON結構中找到時返回 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,因為email鍵不在JSON中。 此外,我們可以通過斷言 emailNodenull 來驗證這一點:

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. 處理深層嵌套的鍵

與其在JSON結構中的某個位置通過名稱查找鍵,不如使用at()方法來針對深層嵌套的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文檔導航的標準化方法。

7. 結論

Jackson的findValue()方法提供了一種強大且靈活的方式來檢索嵌套鍵中的值,用於JSON。

無論處理深度嵌套的對象還是數組,findValue()簡化了該過程,並提高了代碼的可讀性和可維護性。但是,對於字段的精確位置,可以使用at()函數,並使用JSON路徑。

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

發佈 評論

Some HTML is okay.