接口字段校验
后端返回的 JSON 中,user.addresses 数组里每个元素必须包含 city 字段。测试时手动翻看几百行数据太慢,用本工具输入 $.addresses[?(!@.city)],一秒找出所有缺失 city 的地址对象,定位到具体索引,修复时直接按索引改代码。
开发者工具 · JSON / 数据格式
$.a.b[?(@.c==X)] 表达式测试
从后端接口返回的 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 返回的 JSON 里,data.items 数组可能为空。用 $.data.items[?(@==null || @.length==0)] 快速判断是否返回空数组,确认后决定是否重试或降级处理,避免空指针异常。
| 输入 | 输出 | 说明 |
|---|---|---|
| {"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 解析器会因此拒绝解析整个输入,而非给出部分匹配结果。
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 结构里 a.b 的层级是否正确,比如 a 下面是否直接是 b,还是中间有别的字段。其次,[?(@.c==X)] 中的 X 是字符串时要用引号括起来,写成 [?(@.c=='X')] 或 [?(@.c=="X")]。另外注意 JSON 中的值如果是数字或布尔值,则不需要引号。建议先在左侧 JSON 输入框确认数据无误,然后分段测试:先试 $.a.b 看是否能拿到数组,再逐步加上过滤条件。
支持。JSONPath 的过滤表达式里可以访问当前匹配对象下的任意子属性,写法就是 [?(@.c.d==X)]。比如你的 JSON 是 {"a":{"b":[{"c":{"d":1}},{"c":{"d":2}}]}},用 $.a.b[?(@.c.d==1)] 就能拿到第一个对象。注意 @ 代表当前遍历到的数组元素,后面可以跟任意深度的属性路径。如果过滤条件涉及多层嵌套,建议先在左侧 JSON 面板里确认目标字段的完整路径。
中文匹配不生效通常是编码问题。检查 JSON 输入框里的中文和过滤条件里的中文是否完全一致,包括全角半角字符(比如中文逗号 vs 英文逗号)、空格、标点符号。推荐直接在 JSON 里复制要匹配的中文字段值,粘贴到表达式里,避免手动输入导致的差异。本工具运行在浏览器端,不涉及服务端编码转换,所以只要两边字符串字节一致就能匹配。如果还是不行,试试用正则表达式 [?(@.name=~/张三/)] 做模糊匹配。
本工具纯前端运行,解析和匹配速度完全取决于浏览器 JS 引擎和 JSON 大小。几万条扁平数组通常没问题,但如果是深度嵌套的巨型 JSON(比如几十 MB),首次解析和每次表达式求值都可能卡住浏览器几秒甚至崩溃。建议先用文本编辑器分割数据,只保留需要测试的片段。也可以尝试用 Chrome 的开发者工具 Performance 面板查看耗时。如果必须处理大文件,推荐用 Node.js 环境的 jsonpath 库或 jq 命令行工具。
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 的 == 行为一致。
支持的。本工具实现了 JSONPath 的正则过滤语法 [?(@.field=~/pattern/)]。比如要匹配 phone 字段以 138 开头的对象:$.data[?(@.phone=~/^138/)]。注意正则表达式写在两个斜杠之间,不支持修饰符(如 i/g),且匹配的是整个字符串。如果正则写错或语法不支持,表达式会直接返回空结果,不会报错。建议先用简单的正则(比如 /138/)测试确认语法可用,再逐步完善。
JSONPath 没有统一标准,不同工具的实现有差异。常见坑点:1) 根对象有的用 $ 有的用 @;2) 过滤表达式写法,有的用 [?()] 有的用 [?()] 但内部引号要求不同;3) 某些实现支持函数如 min() max(),本工具不支持;4) 通配符 * 匹配所有子节点但有些实现不递归。建议先对照本工具左侧的语法提示,把你拿到的表达式按本工具的写法调整。如果是从 Postman 或 Java 代码里复制的表达式,差异尤其大。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。