在上一篇有关Habré的文章中,我写了有关Jsqry库的信息,该库为JSON对象提供了一种简单便捷的查询语言(DSL)。从那时起已经过去了很多时间,图书馆也得到了发展。引以为傲的另一个原因-该库的测试覆盖了98%的代码。但是,本文并不完全是关于她的。
我认为你们中的许多人都熟悉该工具jq,该工具实际上是在命令行和脚本中使用JSON的事实上的标准。我也是它的活跃用户。但是我一直担心此实用工具的查询的不合理的复杂性和不直观的语法。并非只有我一个人,这里只是黑客新闻的几句话:
我已经使用jq多年了,但仍然无法使其按我期望的那样正常工作。
我与jq有相同的问题。我需要使用我的Google Fu来找出除简单选择之外的其他方法。
我不知道这个术语是什么,心理模型,但是我只是无法点击jq。主要是因为我偶尔需要它。这让我感到沮丧,因为它似乎功能强大。
我知道我在这里可能会持不同意见,但是我永远都不会缠住我的头jq。我可以管理jq .,jq .foo和jq -r,但除此之外,该DSL仅仅是不透明的我。
这么说吧:jq是一个了不起的工具,但是DSL却很糟糕。
是的,我发现jq与编写正则表达式类似:我总是必须查找语法,只有在混乱了为什么我的模式不匹配后才能使它工作,然后几天后将其全部忘记,因此以后必须重新学习。
简而言之,您可能已经猜到了。我有个主意,为什么不把我的JS库变成命令行可执行文件。这里有一个细微差别。该库是用JS编写的,其DSL也依赖于JS。这意味着我们需要找到一种方法来将该程序和一些JS运行时打包到一个独立的可执行文件中。
jsqry-GraalVM版本
对于那些尚未涉足这一领域的人(真的还有这样的东西吗?OO),让我提醒您,GraalVM是Oracle提供的此类功能强大的JVM,具有其他功能,其中最引人注目的是:
- JVM — Java, Javascript, Python, Ruby, R, ..
- AOT- — Java
- JIT- Java.
Graal , , -.
, 1. 2. — JS .
https://github.com/jsqry/jsqry-cli. , — deprecated. , . , 99 . - . , jq 3.7 Linux 64.
.
, Java + JS GraalVM.
App.java. , java- Apache Commons CLI.
java- javascript , src/main/resources.
. -
scripts.add(new String(Files.readAllBytes(Paths.get(jsFileResource.toURI()))));
( , native-image)
java.nio.file.FileSystemNotFoundException: Provider "resource" not installed
"" InputStream
scripts.add(new Scanner(jsFileResource.openStream()).useDelimiter("\\A").next());
, 100% Java .
java.awt.Graphics. GraalVM AWS Lambda .
jsqry — QuickJS edition
- JS QuickJS . qjsc . ES2020. !
, CLI- jsqry: https://github.com/jsqry/jsqry-cli2.
.
, jsqry?
jsqry ( jq) JSON "" DSL.
— JS jsqry .
$ echo '[{"name":"John","age":30},
{"name":"Alice","age":25},
{"name":"Bob","age":50}]' | jsqry 'name'
[
"John",
"Alice",
"Bob"
]
$ echo '[{"name":"John","age":30},
{"name":"Alice","age":25},
{"name":"Bob","age":50}]' | jsqry -1 'name'
"John"
$ echo '[{"name":"John","age":30},{"name":"Alice","age":25},{"name":"Bob","age":50}]' \
| jsqry '[ _.age>=? && _.name.toLowerCase().startsWith(?) ]' --arg 30 --arg-str joh
[
{
"name": "John",
"age": 30
}
]
JSON pretty-printer
$ echo '[{"name":"John","age":30},{"name":"Alice","age":25},{"name":"Bob","age":50}]' \
| jsqry
[
{
"name": "John",
"age": 30
},
{
"name": "Alice",
"age": 25
},
{
"name": "Bob",
"age": 50
}
]
JSON . !
-
2, 100, 2 . . DSL.
$ echo '[1,2,3,4,5]' | jsqry '[_>2] {_+100} s(-_) [-2:]'
[
104,
103
]
JS
jsqry JS- 1 , JS !
$ echo '["HTTP://EXAMPLE.COM/123",
"https://www.Google.com/search?q=test",
"https://www.YouTube.com/watch?v=_OBlgSz8sSM"]' \
| jsqry '{ _.match(/:\/\/([^\/]+)\//)[1].toLowerCase() }'
[
"example.com",
"www.google.com",
"www.youtube.com"
]
help-
$ jsqry
jsqry ver. 0.1.2
Usage: echo $JSON | jsqry 'query'
-1,--first return first result element
-h,--help print help and exit
-v,--version print version and exit
-c,--compact compact output (no pretty-print)
-u,--unquote unquote output string(s)
-as ARG,
--arg-str ARG supply string query argument
-a ARG,
--arg ARG supply query argument of any other type
jq
jq jsqry .
( ): 0.1.2.
, Linux x64 . , . .
, :
$ sudo bash -e -c "
wget https://github.com/jsqry/jsqry-cli2/releases/download/v0.1.2/jsqry-linux-amd64 -O/usr/local/bin/jsqry
chmod +x /usr/local/bin/jsqry
echo \"jsqry \$(jsqry -v) installed successfully\"
"
CLI-
GitHub - . - , . , CLI- , . , , , — .
"bash unit testing" BATS, ShellSpec, Bach , , ( 14 ), tush, .
tush
$ command --that --should --execute correctly
| expected stdout output
$ command --that --will --cause error
@ expected stderr output
? expected-exit-code
tush $, |, @ ? — , . , $ , diff. , diff . :
$ /bin/bash /home/xonix/proj/jsqry-cli2/tests.sh
--- tests.tush expected
+++ tests.tush actual
@@ -1,5 +1,5 @@
$ jsqry -v
-| 0.1.2
+| 0.1.1
$ jsqry -h
| jsqry ver. 0.1.1
!!! TESTS FAILED !!!
tests.tush.
, , .
GitHub Action, , :
JSON
JSON . zvakanaka/color-json , StackOverflow . jq. , null .

, .
npm- QuickJS
npm- jsqry . package.json . npm i. prepare-for-qjs.py, nodejs ES, QuickJS. jsqry-cli.js.
UTF-8 QuickJS
QuickJS stdin. , , QuickJS, . , UTF-8 JS-. , , QuickJS: twardoch/svgop.
build.sh.
"" , .
— tests.sh. , , .
— build.sh QuickJS, tests.sh tush. — .
. ls -lh jsqry . , , CLI- . , — , QuickJS.
652 KB. , , JS.
jq. .