如何使用 JSONPath 查询嵌套 JSON(无需编写循环)
抱歉,我需要您提供要翻译的具体文本内容(除代码块、URL 和源链接之外)。请把文章的正文粘贴在这里,我会按照要求将其翻译成简体中文并保留原有的格式。
介绍
你刚刚收到一个 300 行的 API 响应。在三层嵌套内部的某个位置,有你真正需要的 email 字段。当 API 架构发生变化时,编写嵌套循环很快就会变得脆弱。
JSONPath 提供了一种简洁的、只读的 JSON 查询语言,类似于 XML 的 XPath。掌握语法后,你会经常使用它。
示例 API 响应
{
"store": {
"orders": [
{
"id": 1,
"customer": { "name": "Alice", "email": "alice@example.com" },
"items": [{ "sku": "A1", "qty": 2 }, { "sku": "B3", "qty": 1 }]
},
{
"id": 2,
"customer": { "name": "Bob", "email": "bob@example.com" },
"items": [{ "sku": "C7", "qty": 5 }]
}
]
}
}
获取每位客户的电子邮件
JSONPath 表达式
$.store.orders[*].customer.email
结果
["alice@example.com", "bob@example.com"]
$– 根元素.– 进入对象键[*]– 所有数组元素
按条件过滤
要检索 qty 大于 1 的项目:
表达式
$.store.orders[*].items[?(@.qty > 1)]
结果
[
{ "sku": "A1", "qty": 2 },
{ "sku": "C7", "qty": 5 }
]
?()– 过滤表达式@– 当前节点
与显式循环的比较(Python)
# Without JSONPath — five lines, easy to get wrong
results = []
for order in data["store"]["orders"]:
for item in order["items"]:
if item["qty"] > 1:
results.append(item)
JSONPath 版本只需一行,自解释。
递归下降
当你不知道键的确切位置时,使用递归下降运算符 ..:
$..email
这将在文档的任意深度查找每个 email 字段——对于探索不熟悉的模式非常方便。
实用三步工作流
- Beautify – 将响应粘贴到 JSON Beautifier 中,以获得干净、缩进的视图。
- Validate – 通过 JSON Validator 进行验证,确保其格式正确(格式错误的负载会返回空结果)。
- Query – 使用 JSONPath 工具(例如 jsonindenter.com 上的 JSONPath Evaluator),迭代你的表达式,直到精确提取所需内容。
JSONPath 语法速查表
| 符号 | 含义 |
|---|---|
$ | 根元素 |
.key | 子键 |
..key | 在任意深度递归搜索 key |
[*] | 所有数组元素 |
[0] | 第一个元素([-1] – 最后一个元素) |
[0,2] | 索引为 0 和 2 的元素 |
[?(@.price < 10)] | 过滤条件:price 小于 10 |
@.key | 当前节点的键(在过滤表达式内部) |
实现说明
- Python –
jsonpath-ng - JavaScript –
jsonpath-plus - Java – Jayway JSONPath
实现细节略有不同。RFC 9535(2024 年发布)正朝着标准化方向推进,但在生产代码中,您应针对所使用的具体库测试表达式。
何时使用 JSONPath 与 JSON Patch
JSONPath 是 只读 的:它用于查询和提取数据。
如果需要修改 JSON 文档(添加、替换或删除字段),请使用 JSON Patch(RFC 6902)。这两种工具相辅相成:JSONPath 用于查找,JSON Patch 用于修改。
结论
JSONPath 使复杂的 JSON 查询可组合且易读。一个写得好的表达式一眼就能传达意图,而嵌套循环则迫使读者在理解提取之前必须通读整个块。由于相同的表达式可在 JavaScript、Python、Java 以及 Postman 等工具中使用,学习 JSONPath 能在整个技术栈中受益。
免费工具参考
- JSONPath Evaluator – 在浏览器中实时测试 JSONPath 表达式。
- JSON Beautifier – 将原始 JSON 格式化,便于阅读。
- JSON Validator – 在查询前验证 JSON 是否符合规范。
- JSON Patch – 应用 RFC 6902 补丁,直接修改 JSON 结构。