Dalam artikel terakhir saya di Habré, saya menulis tentang pustaka Jsqry , yang menyediakan bahasa kueri (DSL) sederhana dan nyaman untuk objek JSON. Banyak waktu telah berlalu sejak itu dan perpustakaan juga berkembang. Alasan terpisah untuk kebanggaan - perpustakaan ini memiliki 98% cakupan kode berdasarkan pengujian. Namun, artikel ini tidak sepenuhnya tentang dia.
Saya rasa banyak dari Anda sudah familiar dengan alat ini jq, yang hampir merupakan standar de facto untuk bekerja dengan JSON di baris perintah dan skrip. Saya juga pengguna aktifnya. Tetapi saya terus-menerus khawatir tentang kompleksitas yang tidak dapat dibenarkan dan sintaksis kueri yang tidak intuitif dari utilitas ini. Dan bukan saya sendiri, berikut hanya beberapa kutipan dari berita peretas :
Saya telah menggunakan jq selama bertahun-tahun dan masih tidak bisa membuatnya berfungsi seperti yang saya harapkan.
Saya memiliki masalah yang sama dengan jq. Saya perlu menggunakan google fu saya untuk mencari tahu cara melakukan sesuatu yang lebih dari sekadar memilih.
Saya tidak tahu apa istilahnya, model mental, tapi saya tidak bisa mendapatkan jq untuk diklik. Terutama karena saya hanya membutuhkannya sesekali. Ini membuat saya frustrasi karena tampaknya cukup kuat.
Saya tahu saya mungkin adalah pendapat yang tidak setuju di sini, tetapi saya tidak pernah bisa membungkamjq. Saya dapat mengelolajq .,jq .foodanjq -r, tetapi di luar itu, DSL hanya buram bagi saya.
Anggap saja: jq adalah alat yang luar biasa, tetapi DSL buruk.
Ya, saya menemukan jq mirip dengan menulis regex: Saya selalu harus mencari sintaks, hanya membuatnya berfungsi setelah beberapa kebingungan mengapa pola saya tidak cocok, kemudian lupakan semuanya dalam beberapa hari jadi harus mempelajarinya lagi nanti.
Singkatnya, Anda mungkin sudah bisa menebaknya. Saya mendapat ide, mengapa tidak mengubah perpustakaan JS saya menjadi baris perintah yang dapat dieksekusi.Ada satu nuansa di sini. Pustaka ditulis dalam JS dan DSL-nya juga bergantung pada JS. Ini berarti kita perlu menemukan cara untuk mengemas program dan beberapa JS-runtime menjadi file yang dapat dieksekusi sendiri.
jsqry - edisi GraalVM
Bagi mereka yang belum berada dalam subjek (apakah benar-benar masih seperti itu? OO), izinkan saya mengingatkan Anda bahwa GraalVM adalah JVM yang dipompa dari Oracle dengan fitur tambahan, yang paling mencolok adalah:
- 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
( ): 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 !!!
, , .
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.
"" , .
— tests.sh. , , .
— build.sh QuickJS, tests.sh tush. — .
. ls -lh jsqry . , , CLI- . , — , QuickJS.
652 KB. , , JS.
jq. .