知識庫 / JSON RSS 訂閱

從 JSONObject 中提取扁平和嵌套鍵

JSON
HongKong
5
09:41 PM · Dec 05 ,2025

1. 簡介

當處理 JSON 數據時,在 JSONObject 類中,該類通常由諸如 org.json 這樣的庫提供 – 它是構建的基礎。 經常的要求是從 JSON 對象中提取所有鍵,用於諸如驗證、轉換或數據映射之類的目的。 keySet() 方法提供了一種簡單高效的方法,可以獲取所有這些鍵作為 Set<String>,從而可以輕鬆地迭代它們或執行過濾或轉換等操作。

本質上,Java 中的 JSONObjectMap<String, Object> 類似。 每個鍵都是一個 String,關聯的值可以是基本類型、數組、其他 JSONObject,甚至可以為 null。 keySet() 方法,如 JSON-Java 庫(org.json)提供的實現中可用,提供了一種直接訪問這些鍵的方式,而無需手動轉換或遍歷對象的方法。 有關此庫的更多示例,請參閲介紹。

2. 基本用法:從扁平 JSON 對象中提取鍵

讓我們從一個基本用例開始,該用例從扁平(非嵌套)的 JSON 對象中提取鍵。 以下是一種執行此操作的方法:

public static Set<String> extractKeys(String jsonString) {
    JSONObject jsonObject = new JSONObject(jsonString);
    return jsonObject.keySet();
}

此方法將一個 JSON 字符串解析為 JSONObject,然後調用 keySet() 以檢索所有頂層鍵。為了驗證此行為,我們編寫一個快速單元測試:

@Test 
public void givenFlatJson_whenExtractKeys_thenReturnAllTopLevelKeys() {
    String json = "{\"name\":\"Jane\", \"name_id\":12345, \"city\":\"Vancouver\"}";
    keys = JSONGetValueWithKeySet.extractKeys(json);
    assertTrue(keys.contains("name"));
    assertTrue(keys.contains("name_id"));
    assertTrue(keys.contains("city"));
    assertEquals(3, keys.size());
}

因此,我們準確地從扁平結構中提取所有預期的鍵。

3. 嵌套 JSON 處理:從嵌套對象中提取鍵

扁平結構易於管理,但如果 JSON 包含嵌套對象呢?在這種情況下,我們可以使用遞歸方法來遍歷結構並收集每個級別中的鍵。 為了保持清晰,我們將使用點符號表示層級(例如 user.namecity.id)。

讓我們實現這個遞歸遍歷:

public static void extractNestedKeys(JSONObject jsonObject, String parentKey, Set<String> result) {
    for (String key : jsonObject.keySet()) {
        String fullKey = parentKey.isEmpty() ? key : parentKey + "." + key;
        Object value = jsonObject.get(key);
        result.add(fullKey);
        if (value instanceof JSONObject) {
            extractNestedKeys((JSONObject) value, fullKey, result);
        }
    }
}

使用這種方法,我們遍歷每個鍵值對,如果遇到另一個 JSON 對象, 我們將遞歸地繼續遍歷,同時保留完整的鍵路徑。

讓我們通過一個相應的單元測試來驗證這一點:

@Test
public void givenNestedJson_whenExtractNestedKeys_thenReturnAllKeysWithHierarchy() {
    String json = "{"
      + "\"user\": {"
      +     "\"id\": 101,"
      +     "\"name\": \"Gregory\""
      + "},"
      + "\"city\": {"
      +     "\"id\": 121,"
      +     "\"name\": \"Calgary\""
      + "},"
      + "\"region\": \"CA\""
    + "}";

    JSONObject jsonObject = new JSONObject(json);
    Set<String> actualKeys = new HashSet<>();
    JSONGetValueWithKeySet.extractNestedKeys(jsonObject, "", actualKeys);

    Set<String> expectedKeys = Set.of("user", "user.id", "user.name", "city",
      "city.id", "city.name", "region");
    assertEquals(expectedKeys, actualKeys);
}

這樣一來,我們就能確保所有嵌套鍵都被捕獲,並且層級結構準確地反映在鍵名中。

4. 最佳實踐

在使用 <em>JSONObject</em> 結構時,我們應該記住的主要方面是安全檢查和高效使用。<strong>我們始終應該檢查是否存在<em>null</em>值,並在進行類型轉換之前確保值是<em>JSONObject</em>,以避免異常。</strong> 此外,我們應該將keySet() 返回的集合視為不可變,因為它由原始對象支持。 這樣,如果修改該集合(例如,通過刪除鍵),它將影響原始的 <em>JSONObject</em>。 如果我們的 JSON 包含數組,我們應該考慮是否需要從數組中的對象中提取鍵。 最後,通過使用 <em>keySet()</em>, 即使在處理大型 JSON 對象時,也能確保效率,因為我們避免了將它們轉換為另一種數據結構(例如 `Map)的開銷,除非必要。

5. 結論

從 Java 中的 JSONObject 中提取鍵非常簡單高效,使用 keySet() 方法即可。對於扁平的 JSON 對象,直接遍歷 keySet() 即可。對於嵌套結構,遞歸方法確保所有鍵都能被捕獲,即使在層次結構的深處。遵循最佳實踐,例如進行適當的類型檢查和理解返回集合的可變性,我們可以在 Java 應用程序中可靠地處理 JSON 鍵。

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

發佈 評論

Some HTML is okay.