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 工具 提供实时查询和高亮定位,配合 JMESPathJSON 格式化 构建完整的 JSON 数据处理工作流。

#JSONPath#数据查询#嵌套#过滤#提取