JSONPath 在线查询与求值

用 JSONPath 表达式从嵌套 JSON 里挑出需要的字段,实时查看结果并复制,替代临时写一段取值脚本。

从一段深层嵌套的响应里取几个字段,如果为此写一段临时脚本,光是建项目就比取值本身更费时。JSONPath 用一行表达式描述取数路径:$.data.list[*].id 拿到所有元素的 id,$..price 递归找出任意层级的 price,带条件的过滤表达式还能按值筛选。这个工具让表达式一边输入一边出结果。

求值由前端 JSONPath 库在浏览器中完成,粘贴的 JSON 不会被发送到服务器,也没有请求记录,适合处理含内部字段、订单明细、用户标识的数据。断网状态下同样可以打开使用。

常用表达式怎么写

$ 表示根节点,$.user 取根下的 user 字段,$.list[0] 取数组第一个元素,$.list[*] 或 $.list[:] 取全部元素,$..name 做递归下降,忽略中间层级直接找所有 name。过滤器写成 $..items[?(@.price > 100)],其中 @ 代表当前考察的元素,支持比较运算符与逻辑组合。多个键可以用并集语法一次取出,例如 $.data["id","name"]。键名里带点号或空格时要用方括号加引号,写成 $["my.key"]。

返回结果的形态

返回值始终是匹配项组成的数组,只有一条命中时也是长度为 1 的数组,没有命中时是空数组 [] 而不是报错。结果按 2 空格缩进格式化后显示在下方的只读编辑器里,数组长度就是命中数量,一眼可以看出表达式是不是选多了。复制结果是复制整段数组文本,粘进代码后还需要按目标语言解析一次;如果只想要单个标量,可以在表达式末尾追加下标,例如 $..items[?(@.price > 100)][0].id。

常见报错与排查思路

表达式写错时顶部会显示错误信息,此时结果区为空。容易踩的坑有几个:$..[0] 取的是每一层里每个数组的第 0 个元素,而不是「第一个数组的第一个元素」,命中数往往比预期多;过滤条件里的字符串要用引号包裹,写成 @.status == "paid";被比较的字段类型要对,用数字条件去比字符串字段会得不到结果。此外表达式必须能在解析成功的 JSON 上求值,输入本身有语法错误时结果同样为空。

广告

常见问题

没有匹配到结果就是表达式写错了吗?
不一定。空数组 [] 表示表达式合法但没有命中任何节点,常见于字段名拼错、层级写错,或者过滤条件的值确实不存在。只有顶部出现报错信息才是语法问题。不确定层级时先用 $.. 递归找字段名,确认路径后再写精确表达式。
$..[0] 和 $.list[0] 有什么区别?
$.list[0] 是确定路径,只取根下 list 数组的第一个元素,最多命中一条。$..[0] 是递归通配,会找到文档中每一层的每个数组并各取其第 0 个元素,如果有十处数组就会返回十条结果。想表达第一处数组的第一个元素,需要写成确定路径。
支持过滤和正则这类高级写法吗?
支持过滤表达式,写法为 [?(@.字段 运算符 值)],@ 指当前元素,字符串值要用引号,多个条件可以用逻辑运算符连接。表达式语法遵循前端 jsonpath-plus 库的实现,包含一些标准之外的扩展能力,但各语言的后端 JSONPath 实现存在差异,同一表达式换语言执行前建议先验证。
查询会修改我的 JSON 吗?
不会。求值是只读操作,原始 JSON 只被解析和读取,不会被改动,结果区的内容也是只读的。想对数据做修改,可以先复制结果,再回到格式化或压缩功能里处理,那些操作会直接改写编辑器内容。

相关工具

广告