JSONPath 查询指南:从 JSON 中精准提取嵌套数据
JSON(更新于 2026年6月18日)
JSONPath 是什么
JSONPath 是一种 JSON 数据查询语言,类似 XPath 之于 XML,能从复杂嵌套 JSON 中精准提取数据:
{
"store": {
"books": [
{"title": "三体", "price": 68},
{"title": "活着", "price": 45},
{"title": "百年孤独", "price": 55}
]
}
}
使用 $.store.books[*].title 即可提取所有书名:["三体", "活着", "百年孤独"]
基础语法速查
| 语法 | 含义 | 示例 |
|---|---|---|
$ |
根节点 | $ |
. |
子节点 | $.store |
[] |
数组索引或子节点 | $[0]、$['key'] |
* |
通配符,所有元素 | $.store.* |
.. |
递归下降,所有层级 | $..title |
[start:end] |
数组切片 | $[0:2] |
[?(expr)] |
过滤表达式 | $[?(@.price > 50)] |
逐个语法详解
根节点 $
$ 代表 JSON 根,所有路径都从 $ 开始:
$ → 整个 JSON
$.store → store 对象
子节点访问 .
用 . 或 [] 访问子节点:
$.store.books → books 数组
$.store['books'] → 等价写法,键名含特殊字符时必须用此形式
数组索引 []
$.store.books[0] → 第一本书
$.store.books[-1] → 最后一本书
$.store.books[0:2] → 前两本书(切片)
通配符 *
$.store.books[*] → 所有书
$.store.books[*].title → 所有书名
递归下降 ..
.. 搜索所有层级,无需知道完整路径:
$..title → 所有层级的 title 字段
$..price → 所有层级的 price 字段
在深度嵌套的 API 响应中,
..特别好用。
过滤表达式 ?()
过滤是 JSONPath 最强大的功能:
比较运算符
| 运算符 | 含义 | 示例 |
|---|---|---|
== |
等于 | $[?(@.price == 45)] |
!= |
不等于 | $[?(@.price != 45)] |
> |
大于 | $[?(@.price > 50)] |
< |
小于 | $[?(@.price < 50)] |
>= |
大于等于 | $[?(@.price >= 55)] |
逻辑运算符
$[?(@.price > 50 && @.price < 70)] → 价格在 50-70 之间
$[?(@.category == 'fiction' || @.price < 40)] → 虚构类或价格低于 40
字符串匹配
$[?(@.title =~ /三.*/)] → 标题以"三"开头
使用 JSONPath 工具
第一步:打开工具
访问 JSONPath 工具,进入查询界面。
第二步:输入 JSON 数据
将 API 响应或 JSON 数据粘贴到输入框。可先用 JSON 格式化 美化数据。
第三步:编写 JSONPath 表达式
在查询框中输入表达式,如 $.data.users[*].name。
第四步:查看提取结果
工具实时显示匹配结果,支持高亮定位匹配节点在原文中的位置。
实战:从 API 响应提取数据
GitHub API 示例
{
"items": [
{"full_name": "vuejs/vue", "stargazers_count": 45000, "language": "TypeScript"},
{"full_name": "facebook/react", "stargazers_count": 42000, "language": "JavaScript"}
]
}
$.items[*].full_name → 所有仓库名
$.items[?(@.stargazers_count > 43000)].full_name → Star > 43000 的仓库名
分页数据提取
$.data.list[*].id → 当前页所有 ID
$.pagination.next_cursor → 下一页游标
JSONPath vs JMESPath
| 对比项 | JSONPath | JMESPath |
|---|---|---|
| 语法风格 | 类 XPath | 类 SQL/管道 |
| 递归搜索 | .. 原生支持 |
需显式遍历 |
| 过滤语法 | [?(@.x > 1)] |
[?x > 1] |
| 投影/变换 | 不支持 | 支持 [*].{n: name} |
| 多结果排序 | 不保证 | 可排序 |
| 工具 | JSONPath | JMESPath |
简单提取用 JSONPath,需要变换/投影用 JMESPath。
常见问题
| 问题 | 原因 | 解决 |
|---|---|---|
| 查询返回空 | 路径拼写错误 | 检查键名大小写 |
| 过滤不生效 | 语法版本差异 | 确认工具支持的语法版本 |
| 数组越界 | 索引超出范围 | 使用 [*] 或检查数组长度 |
| 递归结果太多 | .. 匹配了所有层级 |
缩小范围或加过滤条件 |
| 特殊字符键名报错 | 键名含 . 或 - |
使用 ['key.name'] 括号语法 |
总结
JSONPath 是处理 JSON 数据的利器,掌握 $、.、[]、*、..、?() 六大语法,就能从任意嵌套 JSON 中精准提取数据。JSONPath 工具 提供实时查询和高亮定位,配合 JMESPath 和 JSON 格式化 构建完整的 JSON 数据处理工作流。
#JSONPath#数据查询#嵌套#过滤#提取