开发者工具 · JSON / 数据格式

JSON Path

$.a.b[?(@.c==X)] 表达式测试

✓本地处理 · 不上传 ✓免费 · 无需登录 ✓无次数限制 累计 119 次使用
第一节

关于本工具

About

从后端接口返回的 JSON 里揪出某个 `status` 为 `error` 的字段,手写循环或递归太慢。这个工具直接解析 `$.data.list[?(@.status=="error")]` 这类路径表达式,输入 JSON 和路径,立即高亮匹配结果,并显示路径语法是否合法。表达式引擎在浏览器本地运行,原始 JSON 文本不会离开设备。

使用场景

壹

接口字段校验

后端返回的 JSON 中,user.addresses 数组里每个元素必须包含 city 字段。测试时手动翻看几百行数据太慢,用本工具输入 $.addresses[?(!@.city)],一秒找出所有缺失 city 的地址对象,定位到具体索引,修复时直接按索引改代码。

贰

日志异常排查

凌晨线上告警:用户订单状态异常。日志 JSON 里 orders 数组有 2000 条记录,每条含 status 和 errorCode。用 $.orders[?(@.status=='failed' && @.errorCode>0)] 直接过滤出所有失败且带错误码的订单,拿到 errorCode 分布后通知对应服务负责人,比 grep 全文搜索快 10 倍。

叁

配置项合规检查

微服务配置中心下发 JSON,要求所有 database 节点必须包含 backup 字段。用 $.configs..database[?(!@.backup)] 检查所有嵌套层级的 database 对象,发现 3 个服务漏配备份策略,在灰度发布前补上,避免数据丢失风险。

肆

动态表单数据过滤

低代码平台中,用户填写的表单提交后生成 JSON,需要筛选出所有年龄大于 60 且勾选了「慢性病」的条目。用 $.formData[?(@.age>60 && @.chronicDisease==true)] 直接拿到目标数据,用于后续健康关怀推送,无需写代码遍历。

伍

API 响应结构验证

联调时第三方 API 返回的 JSON 里,data.items 数组可能为空。用 $.data.items[?(@==null || @.length==0)] 快速判断是否返回空数组,确认后决定是否重试或降级处理,避免空指针异常。

第二节

使用指南

Getting Started

输入输出示例

输入输出说明
{"a":{"b":[{"c":1},{"c":2},{"c":3}]}} | $.a.b[?(@.c==2)][{"c":2}]常规:基础过滤表达式,测试标准属性筛选功能
{"a":{"b":[{"c":"X"},{"c":"Y"},{"c":"Z"}]}} | $.a.b[?(@.c=="X")][{"c":"X"}]常规:字符串值过滤,验证引号处理正确性
{"a":{"b":[]}} | $.a.b[?(@.c==1)][]边界:空数组过滤,验证工具不会报错或返回null
{"a":{"b":[{"c":null},{"c":2}]}} | $.a.b[?(@.c==null)][{"c":null}]边界:null值匹配,测试对null类型的处理能力
{"a":{"b":[{"c":1},{"c":2}]}} | $.a.b[?(@.c=="1")][]易错:数字与字符串严格类型比较,1≠"1",暴露类型敏感特性
{"a":{"b":[{"c":1.5},{"c":2.0}]}} | $.a.b[?(@.c==2.0)][{"c":2.0}]易错:浮点数比较,验证2.0与2是否视为相等(取决于实现)
{"a":{"b":[{"c":true},{"c":false}]}} | $.a.b[?(@.c==true)][{"c":true}]边界:布尔值过滤,验证对true/false的识别

常见错误对照

1.根节点遗漏 `$` 符号

✗ 错误`.store.book[0].title`
✓ 修复`$.store.book[0].title`

JSONPath 规范要求表达式必须以 `$` 开头表示根对象;省略 `$` 会导致解析器无法定位起点,报语法错误或返回空结果。

2.数组索引从 1 开始计数

✗ 错误`$.store.book[1]` (期望取第一本书)
✓ 修复`$.store.book[0]`

JSONPath 数组索引遵循 JavaScript 惯例、从 0 开始;写 `[1]` 实际取的是第二项。这是新手最常踩的坑。

3.过滤表达式缺少 `@` 当前节点引用

✗ 错误`$.store.book[?(.price < 10)]`
✓ 修复`$.store.book[?(@.price < 10)]`

过滤条件 `[?(...)]` 内必须用 `@` 指代当前正在遍历的数组元素;漏写 `@` 会导致表达式被解释为全局路径查找,结果为空或报错。

4.属性名含空格或特殊字符未加引号

✗ 错误`$.store.book[0].author name`
✓ 修复`$.store.book[0]['author name']` 或 `$.store.book[0].["author name"]`

JSON 键名如果包含空格、连字符或点号,必须用方括号加引号包裹;直接写点号连接会被解析为多级路径,导致查找失败。

5.字符串比较值未加引号

✗ 错误`$.store.book[?(@.category == fiction)]`
✓ 修复`$.store.book[?(@.category == 'fiction')]`

过滤表达式中字符串字面量必须用单引号或双引号包裹;不加引号时 `fiction` 会被当作变量名或路径来解析,而非字符串值。

6.通配符 `*` 误用于对象属性名

✗ 错误`$.store.*.title` (期望取所有子对象的 title)
✓ 修复`$.store..title` 或 `$.store[*].title`

JSONPath 中 `*` 只对数组元素或对象子节点有效,不能作为属性名通配符跨级匹配;要递归查找需用 `..` 深层扫描操作符。

7.递归下降 `..` 后直接跟过滤条件

✗ 错误`$..[?(@.price > 10)]`
✓ 修复`$..book[?(@.price > 10)]`

`..` 会遍历所有层级的全部节点,若直接跟过滤条件则会在每个节点(包括非数组节点)上执行 `?` 判断,导致性能骤降或类型错误;应先用路径缩小范围。

8.JSON 字符串末尾残留逗号

✗ 错误输入 JSON 为 `{"a":1,"b":2,}`
✓ 修复`{"a":1,"b":2}`

JSON 标准(RFC 7159)禁止对象/数组末尾出现逗号;多数 JSONPath 解析器会因此拒绝解析整个输入,而非给出部分匹配结果。

第三节

工作原理

How It Works

核心公式

result = $.a.b[?(@.c==X)]

变量说明

  • $根对象,JSON 文档起始点
  • a根对象下的第一层键
  • ba 对象下的第二层键
  • @当前遍历的数组元素
  • c数组元素中的属性键
  • X过滤条件值,字符串或数字

示例

JSON 数据:{ "a": { "b": [ { "c": "apple" }, { "c": "banana" } ] } },表达式 $.a.b[?(@.c=="apple")]:遍历数组 b,筛选出 c 等于 "apple" 的元素,结果为 [ { "c": "apple" } ]。

输入 JSON 数据解析 JSON 结构(构建对象树)解析 Path 表达式(拆解为路径段)逐段遍历匹配(含过滤条件评估)输出匹配结果(数组 / 值 / null)
用户输入 本地处理 输出结果
第五节

常见问题

Q & A
问为什么我写的 $.a.b[?(@.c==X)] 表达式没匹配到任何结果?+
答

最常见的原因是路径写错或大小写不匹配。先检查 JSON 结构里 a.b 的层级是否正确,比如 a 下面是否直接是 b,还是中间有别的字段。其次,[?(@.c==X)] 中的 X 是字符串时要用引号括起来,写成 [?(@.c=='X')] 或 [?(@.c=="X")]。另外注意 JSON 中的值如果是数字或布尔值,则不需要引号。建议先在左侧 JSON 输入框确认数据无误,然后分段测试:先试 $.a.b 看是否能拿到数组,再逐步加上过滤条件。

问这个工具支持过滤嵌套对象吗,比如 a.b[?(@.c.d==X)]?+
答

支持。JSONPath 的过滤表达式里可以访问当前匹配对象下的任意子属性,写法就是 [?(@.c.d==X)]。比如你的 JSON 是 {"a":{"b":[{"c":{"d":1}},{"c":{"d":2}}]}},用 $.a.b[?(@.c.d==1)] 就能拿到第一个对象。注意 @ 代表当前遍历到的数组元素,后面可以跟任意深度的属性路径。如果过滤条件涉及多层嵌套,建议先在左侧 JSON 面板里确认目标字段的完整路径。

问用 [?(@.name=='张三')] 匹配中文,为什么有时不生效?+
答

中文匹配不生效通常是编码问题。检查 JSON 输入框里的中文和过滤条件里的中文是否完全一致,包括全角半角字符(比如中文逗号 vs 英文逗号)、空格、标点符号。推荐直接在 JSON 里复制要匹配的中文字段值,粘贴到表达式里,避免手动输入导致的差异。本工具运行在浏览器端,不涉及服务端编码转换,所以只要两边字符串字节一致就能匹配。如果还是不行,试试用正则表达式 [?(@.name=~/张三/)] 做模糊匹配。

问这个工具能处理超大 JSON 文件吗?比如几万条数据会不会卡死?+
答

本工具纯前端运行,解析和匹配速度完全取决于浏览器 JS 引擎和 JSON 大小。几万条扁平数组通常没问题,但如果是深度嵌套的巨型 JSON(比如几十 MB),首次解析和每次表达式求值都可能卡住浏览器几秒甚至崩溃。建议先用文本编辑器分割数据,只保留需要测试的片段。也可以尝试用 Chrome 的开发者工具 Performance 面板查看耗时。如果必须处理大文件,推荐用 Node.js 环境的 jsonpath 库或 jq 命令行工具。

问我想取数组里前三个元素,用 $.a.b[0:3] 为什么报错?+
答

JSONPath 标准里切片语法是 [start:end:step],但不同实现支持程度不一样。本工具遵循的是 Goessner 版本的 JSONPath,它支持 [#] 下标和 [?(表达式)] 过滤,但不支持 Python 风格的切片 [0:3]。要实现取前 N 个,可以用 [?(@.index<3)] 配合数组索引,或者直接输出整个数组后手动截取。如果必须用切片,可以考虑换用支持切片语法的 JSONPath 实现,比如 Jayway JSONPath(Java)或 jsonpath-plus(JS)。

问我想匹配数组里属性值不等于某个条件的数据,怎么写?+
答

用 != 运算符即可。比如过滤出 c 不等于 X 的项:$.a.b[?(@.c!='X')]。本工具支持 !=、<、>、<=、>= 这些比较运算符。如果要匹配多个条件,可以用 && 和 || 组合,例如 [!(@.c=='X' || @.c=='Y')] 取不等于 X 且不等于 Y 的项。注意逻辑取反要写在外层筛选表达式里,不能直接在 @ 前面加 !。另外,如果属性不存在,!= 也会匹配到(因为 undefined != 'X' 为 true),这一点跟 JavaScript 的 == 行为一致。

问这个工具支持正则匹配吗?比如匹配所有手机号开头是 138 的数据。+
答

支持的。本工具实现了 JSONPath 的正则过滤语法 [?(@.field=~/pattern/)]。比如要匹配 phone 字段以 138 开头的对象:$.data[?(@.phone=~/^138/)]。注意正则表达式写在两个斜杠之间,不支持修饰符(如 i/g),且匹配的是整个字符串。如果正则写错或语法不支持,表达式会直接返回空结果,不会报错。建议先用简单的正则(比如 /138/)测试确认语法可用,再逐步完善。

问为什么我复制别人写的 JSONPath 表达式过来,结果不对?+
答

JSONPath 没有统一标准,不同工具的实现有差异。常见坑点:1) 根对象有的用 $ 有的用 @;2) 过滤表达式写法,有的用 [?()] 有的用 [?()] 但内部引号要求不同;3) 某些实现支持函数如 min() max(),本工具不支持;4) 通配符 * 匹配所有子节点但有些实现不递归。建议先对照本工具左侧的语法提示,把你拿到的表达式按本工具的写法调整。如果是从 Postman 或 Java 代码里复制的表达式,差异尤其大。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

↑↓选择 ↵打开 ⌘+↵新窗口 esc关闭