知識庫 / JSON / Jackson RSS 訂閱

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

Jackson
HongKong
9
09:42 PM · Dec 05 ,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對象內,該對象又嵌套在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 時,我們可能會遇到鍵丟失的情況。<em>findValue()</em> 方法在鍵未在 JSON 結構中找到時,會返回 <em>null</em>

請考慮以下 JSON,其中 <em>email</em> 鍵丟失:

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]"
          }
        }
      }
    }
  }
}

為了獲取團隊負責人(team lead)的電子郵件地址,我們首先將 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 指針,它是使用字符串語法通過 JSON 文檔進行導航的一種標準化方法。

7. 結論

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

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

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

發佈 評論

Some HTML is okay.