1. 概述

本文将带你快速掌握如何使用 JsonPath 对 JSON 文档中的对象和数组进行计数。

JsonPath 提供了一种标准化的方式来遍历 JSON 文档的特定部分。你可以把它理解为:JsonPath 之于 JSON,就像 XPath 之于 XML。✅
这在解析复杂响应、做断言或数据提取时非常实用,尤其是在自动化测试或微服务间数据校验场景中踩过坑的同学应该深有体会。

2. 依赖配置

我们使用社区广泛采用的 JsonPath 库,Maven 坐标如下:

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.9.0</version>
</dependency>

⚠️ 注意:虽然 jayway 是老牌实现,但目前项目已归档,建议生产环境考虑迁移到活跃维护的分支(如 com.fasterxml.jackson.jayway.jsonpath),不过基础语法完全兼容。

3. 示例 JSON 数据

以下 JSON 将用于后续所有示例:

{
    "items":{
        "book":[
            {
                "author":"Arthur Conan Doyle",
                "title":"Sherlock Holmes",
                "price":8.99
            },
            {
                "author":"J. R. R. Tolkien",
                "title":"The Lord of the Rings",
                "isbn":"0-395-19395-8",
                "price":22.99
            }
        ],
        "bicycle":{
            "color":"red",
            "price":19.95
        }
    },
    "url":"mystore.com",
    "owner":"baeldung"
}

4. 统计 JSON 对象的键数量

根节点用 $ 表示。通过 JsonPath.read(json, "$") 可获取整个根对象。

public void shouldMatchCountOfObjects() {
    Map<String, String> objectMap = JsonPath.read(json, "$");
    assertEquals(3, objectMap.keySet().size());
}

✅ 解读:

  • 根层级包含 itemsurlowner 三个 key
  • 返回的是一个 Map,所以直接 .keySet().size() 即可得到顶层字段数量
  • 这种方式适合判断响应结构完整性,比如接口返回是否多了或少了顶层字段 ❌

5. 统计 JSON 数组长度

要获取 items.book 数组的元素个数,可用通配符 [*] 匹配数组所有元素:

public void shouldMatchCountOfArrays() {
    JSONArray jsonArray = JsonPath.read(json, "$.items.book[*]");
    assertEquals(2, jsonArray.size());
}

✅ 关键点:

  • $.items.book[*] 表示从根开始,进入 items,再进入 book 数组的所有元素
  • 返回类型为 JSONArray,调用 .size() 即可获得数组长度
  • 也可简写为 $.items.book,效果相同(JsonPath 会自动识别数组)

💡 小技巧:
如果你想验证某个数组长度大于 0,可以直接写断言:

assertTrue(JsonPath.read(json, "$.items.book[*]").size() > 0);

这在 API 响应非空校验中非常实用。

6. 总结

本文展示了如何使用 JsonPath 简单粗暴地完成两类常见计数需求:

  • ✅ 统计顶层对象的字段数量
  • ✅ 获取指定数组的元素个数

这些技巧在编写 REST API 测试、响应断言、数据抽取等场景中极为常用。

📌 更多高级路径写法可参考 官方文档 - Path Examples
💻 完整代码示例已上传至 GitHub:https://github.com/baeldung/tutorials/tree/master/json-modules/json-path


原始标题:Count with JsonPath