跳到正文

jq 在线试验场

jq Playground

在浏览器里对粘贴的 JSON 跑 jq 1.7 过滤器,附一份速查表,并给出等效的命令行。

在浏览器里对一份文档运行 jq 过滤器——一个真正实现 jq 1.7 语法的解释器,而不是几个字符串操作,所以管道、`reduce`、`def`、解构和更新运算符的行为都和命令行上一样。等价的 shell 命令打印在过滤器下方。

🔒 完全在你的浏览器里运行jqjsonqueryplayground

过滤器

jq '.orders[] | select(.status == "shipped") | {id, customer}' data.json

输入 JSON

拖入 .json 文件

只在这个标签页里读取,不上传。

1条输出

输出

1

耗时

3 ms

类型

object

这是在这里手写的一个 jq 1.7 语法解释器。它支持路径(.a[0].b, .., ?)、|·,·//、算术、比较、and/or/not、字符串插值、if、try、reduce、foreach、as(含解构)、def,以及 |=·+= 这样的更新、@base64·@csv 这样的格式,还有下面列出的 180个内置函数。测试用的就是 jq 手册里的例子。

不支持的:input·inputs(文档只有一份)、$ENV·env(是空的)、label·break、--stream、@sh 里的嵌套数组、strptime 中 ISO 8601 以外的格式、getpath 的流模式,以及模块(import)。正则跑在浏览器自己的引擎上,而不是 jq 的 Oniguruma,所以 \p{L} 和命名分组是可以用的,而在后行断言那一带可能有些细微差别。

如果你只是想取一条路径,用 JSONPath 测试器可能更简单。

怎么用

  1. 粘贴文档

    一个 JSON 值,或连续的几个——工具把它们当作 jq 的输入流读取,数量显示在面板标题里。

  2. 写过滤器,或从示例行里取一个

    按钮覆盖了常见的形状:select、map、group_by、字符串插值、reduce,以及更新运算符。悬停在一个上面会说明它做什么。

  3. 设置你在命令行上会用的标志

    `-c` 让每个输出占一行,`-S` 给键排序,`-r` 输出不带引号的字符串,`-s` 把多个输入吸成一个数组。底部的命令行随之更新。

  4. 复制命令,不只是输出

    生成的 `jq …` 行按 POSIX shell 正确引用,可以直接放进脚本或管道。

常见问题

这真的是 jq 吗?

它是一个独立实现的 jq 语法解释器,用 jq 自己手册里的示例测试过。这覆盖了语言和常用内置函数;它不是 jq 本身的编译产物,所以任何依赖 jq C 内部实现的东西都会有差异。

为什么 `input` 不起作用?

因为这里只有一份文档,不是过滤器能继续拉取的流。`input`、`inputs`、`$ENV`、`env`、`label`/`break`、`--stream` 和模块都在页面上列为不支持,而不是莫名其妙地失败。

我的正则表达式行为和 jq 的不一样。

jq 用 Oniguruma;这里用浏览器的引擎。实际上 `\p{L}` 和命名组在两边都能用,差异出现在后行断言和少数字符类转义上。如果一个模式很要紧,在将要运行它的机器上测试。

它在 5,000 个输出处停下了。

这是有意的限制,还有一个步数限制。对大文档做 `..` 会产生海量输出,一个失控递归的过滤器否则会把标签页挂死。收窄过滤器,或者到命令行上运行,那里你可以用管道接 `head`。

可以从这些接进来

接下来

这些工具吃得下当前工具的产出,结果可以直接送过去。