在线 JSONPath 查询工具:从 JSON 数据中提取所需信息
什么是 JSONPath
JSONPath 是一种用于从 JSON 数据结构中提取信息的查询语言,类似于 XML 的 XPath。它使用路径表达式来定位和提取 JSON 中的特定数据——配合 JSON Formatter 先把嵌套结构格式化,查询起来更轻松。
基本语法
| 表达式 | 说明 | 示例 |
|---|---|---|
$ | 根节点 | $ |
. | 子节点 | $.name |
[] | 子节点/过滤 | $['name'] |
* | 通配符 | $.* |
.. | 递归搜索 | $..name |
@ | 当前节点 | $.users[?(@.age>25)] |
为什么需要 JSONPath
- API 数据提取:从复杂的 API 响应中精确提取需要的字段
- 数据转换:从嵌套 JSON 中提取数据并重组
- 日志分析:从结构化日志中筛选特定信息
- 配置管理:从多层配置文件中读取特定值
- 测试断言:API 测试中验证特定字段值
- 数据迁移:在不同数据结构间映射字段
JSONPath 表达式详解
示例 JSON 数据
{
"store": {
"books": [
{ "title": "JavaScript 权威指南", "price": 99, "category": "编程" },
{ "title": "CSS 揭秘", "price": 79, "category": "前端" },
{ "title": "HTTP 权威指南", "price": 89, "category": "网络" }
],
"bicycle": { "color": "red", "price": 299 }
}
}
常用表达式
| JSONPath | 结果 |
|---|---|
$.store.books[*].title | 所有书名 |
$.store.books[0] | 第一本书 |
$.store.books[(@.length-1)] | 最后一本书(脚本形式,见下方陷阱) |
$.store.books[?(@.price<85)] | 价格低于85的书 |
$.store.books[?(@.category=='前端')].title | 前端类书籍名 |
$.store..price | 所有价格 |
$.store.books.length() | 书籍数量(仅部分实现支持) |
注意:
[-1]负下标在 jsonpath-plus(本工具引擎)中静默返回空数组,不会报错。取最后一个元素请使用脚本表达式[(@.length-1)]。length()函数在 jsonpath-plus 中同样不受支持,不同方言差异很大——详见下文「五大特性」。
如何使用在线工具
使用 ToolVault 工具匣 的 JSONPath 查询工具:
- 粘贴 JSON 数据
- 输入 JSONPath 表达式
- 实时显示查询结果
- 支持语法高亮和错误提示
- 空表达式会直接报错,首尾空格/换行自动剔除——减少「明明路径对却返回空」的假阴性
配合 JSONPath 生成器:点击树节点自动生成路径,内置的常用表达式模板(全部书名/最后一本/价格过滤等)已在本工具引擎上逐条验证,点一下即可试跑。
JSONPath 在代码中的使用
JavaScript
// 简单的 JSONPath 实现
function jsonPath(obj, path) {
const keys = path.replace(/\$/,'').replace(/\[(\d+)\]/g, '.$1').split('.').filter(Boolean);
return keys.reduce((current, key) => current?.[key], obj);
}
// 使用
const data = { store: { books: [{ title: 'JS 权威指南', price: 99 }] } };
const title = jsonPath(data, '$.store.books[0].title'); // 'JS 权威指南'
Python
import jsonpath_ng
def json_path_query(data, expression):
jsonpath_expr = jsonpath_ng.parse(expression)
return [match.value for match in jsonpath_expr.find(data)]
# 使用
data = {"store": {"books": [{"title": "JS 权威指南", "price": 99}]}}
results = json_path_query(data, "$.store.books[*].title")
使用 jsonpath-ng 库(Python)
from jsonpath_ng import parse
expression = parse('$.store.books[?(@.price<90)]')
matches = expression.find(data)
for match in matches:
print(match.value)
JSONPath vs JSON Pointer
| 特性 | JSONPath | JSON Pointer |
|---|---|---|
| 语法 | 类 XPath | 类 URL 路径 |
| 过滤 | ✅ 支持条件查询 | ❌ 不支持 |
| 通配符 | ✅ 支持 | ❌ 不支持 |
| 递归搜索 | ✅ .. 语法 | ❌ 不支持 |
| 标准 | 社区标准 | RFC 6901 |
| 适用场景 | 复杂查询 | 简单定位 |
五大特性:实现之间各说各话
JSONPath 无规范性 spec——实现间分歧点:方括号 vs 点号访问特殊字符键(都合法、一个常坏);过滤器(?(@.price < 10)——比较运算符和正则支持差异巨大,jsonpath-plus 里正则要用 @.name.match(/re/i) 而不是 =~);深浅通配符;负索引切片(jsonpath-plus 的 [-1] 静默空匹配,要改写为 [(@.length-1)]);联合下标。实用规则:核心路径(点导航、简单通配、单下标)处处可用;过滤器和联合是方言。「tester 里能用生产不行」= 两个方言——先报实现名(Jayway、Goessner、jsonpath-plus)再抄查询。
过滤器进阶与调试技巧
大家先学的 ?(@.price < 10) 只是皮毛:存在性检查(?(@.discount)——有这个字段)、嵌套路径过滤(?(@.address.city == "北京"))、布尔组合。值得内化的模式:过滤器在路径上下文内生效——$.orders[?(@.paid)] 过滤订单,后接 .items 进入幸存者内部。过滤器返回空时的调试技巧:先去掉过滤器跑路径——前结果就空的话,bug 在导航不在谓词。
为什么你的查询返回了空数组
空数组是 JSONPath 最误导人的输出——它同时意味着「路径没匹配到」和「表达式语法在当前方言下被静默吞掉」。排查顺序:
- 先跑无过滤的裸路径(
$.store.books而不是$.store.books[?(...)])——裸路径就空,问题在导航;裸路径有值而过滤后空,问题在谓词。 - 检查首尾空白:从文档或终端复制表达式时带入的空格、换行,会让部分引擎静默空匹配。本工具已自动剔除首尾空白,但在代码里调用库时要自己 trim。
- 核对方言特性:
[-1]、length()、=~在 jsonpath-plus 里都是静默失败或抛错的重灾区;换库前先跑一遍最小用例。 - 用生成器反向验证:在 JSONPath 生成器 里点选目标节点,比对生成路径与你手写的差异——结构与拼写问题一眼可见。
JSONPath、jq、SQL:选查询工具
JSONPath 做选择(返回子树——API 响应提取与测试断言的完美工具);jq 做变换(管道、重构、算术——一门也做选择的编程语言);SQL 做查询(索引、连接、聚合——JSON 装进库之后)。人人的升级路径:测试里的 JSONPath → shell 管线里的 jq → 数据大到文件装不下时的 SQL。要避免的是直接跳到终点:SQL 里每行 JSON_EXTRACT(无索引、全表扫)做一次性分析比同文件的 jq 慢。
FAQ
JSONPath 有标准吗?
JSONPath 目前没有正式的 RFC 标准,但有一个广泛接受的社区标准。不同语言的实现可能有细微差异,但核心语法是一致的。
如何处理 JSONPath 中的中文?
JSONPath 表达式本身支持 Unicode,可以直接使用中文键名:$.data['中文键名']。但建议 JSON 键名使用英文,避免编码问题。
JSONPath 查询性能如何?
对于大型 JSON 数据,JSONPath 查询性能取决于表达式复杂度和数据结构。简单路径查询(如 $.data[0].name)性能很好。递归搜索(..)在深层嵌套数据上可能较慢。建议在应用层缓存查询结果。
表达式明明写对了,为什么返回空?
最常见的三个原因:表达式首尾带了空格或换行(本工具已自动剔除);路径与 JSON 实际结构不符(用 JSONPath 生成器 点选验证);使用了当前方言不支持的语法(例如 jsonpath-plus 不支持 [-1] 负下标,请改用 [(@.length-1)])。空表达式会直接报错,不会再静默返回空数组。
排查注记
「为什么你的查询返回了空数组」排在教程主体之后,因为空数组是 JSONPath 最误导人的输出——它同时意味着「路径没匹配到」和「表达式语法被当前方言静默吞掉」。排查第一步设计成先跑无过滤的裸路径:裸路径就空、bug 在导航;裸路径有值而过滤后空、问题在谓词——一步把问题域切半。方言一节的规则很实用:「tester 里能用生产不行」就是撞上两个方言,先报实现名(Jayway、Goessner、jsonpath-plus)再抄查询;工具的自动 trim 和空表达式直接报错,也都是冲着减少「明明路径对却返回空」的假阴性去的。
本文出自 ToolVault 工具匣。首页 汇集了更多浏览器本地工具。
相关工具
相关文章
在线 CSV 转 SQL 工具:将表格数据导入数据库
CSV 转 INSERT:空单元格→NULL、MySQL 反引号或 PostgreSQL 双引号、BOM 剥离、Markdown 竖线转义,以及与 COPY/LOAD 的分工。
HTML 表格转 JSON 怎么保留行列结构?
把网页里的 HTML 表格转成 JSON,怎么保留表头、处理合并单元格、保持嵌套结构?逐步方法并附本站 HTML 表格转 JSON 工具。
Excel 转 JSON 后日期变成数字 / 中文乱码,怎么办?
把 Excel 转成 JSON 时日期变 44927 这种数字、中文乱码、空单元格丢失怎么办?讲清 Excel 日期序列号与编码坑,并附本站 Excel 转 JSON 工具。