3 poin oleh GN⁺ 2023-09-07 | 1 komentar | Bagikan ke WhatsApp
  • Opsi --argfile yang sempat tidak lagi didukung, serta filter leaf_paths dan recurse_down, telah dihapus
  • Image Docker kini disediakan di ghcr.io/jqlang/jq alih-alih Docker Hub
  • Target build rilis kini mencantumkan berbagai arsitektur untuk Linux, macOS, Windows, dan Docker
  • --raw-output0 ditambahkan sehingga byte NUL bisa disisipkan di antara output, dan output string yang mengandung NUL akan diperlakukan sebagai error
  • Di Windows, opsi --binary/-b ditambahkan sehingga akhir baris dapat dikeluarkan sebagai \n alih-alih \r\n
  • Warna kunci objek kini dapat diatur dengan JQ_COLORS, dan output berwarna dinonaktifkan dengan menghormati variabel lingkungan NO_COLOR
  • Masalah kode keluar pada opsi --exit-code/-e telah diperbaiki: mengembalikan 0 jika nilai output terakhir bernilai benar, 1 jika false atau null, dan 4 jika tidak ada output
  • Literal angka desimal kini digunakan untuk mempertahankan presisi literal numerik; operasi perbandingan menghormati presisi, tetapi operasi aritmetika masih bisa terpotong
  • Fungsi bawaan baru pick(stream), debug(msgs), scan($re; $flags), dan abs telah ditambahkan
  • Dalam pernyataan if, cabang else kini bisa dihilangkan, dan else yang dihilangkan akan diperlakukan sebagai perilaku .
  • halt dan halt_error kini segera berhenti tanpa melanjutkan ke input berikutnya
  • Telah diperbaiki masalah representasi angka besar yang pada beberapa platform menghasilkan output JSON yang salah, error segmentasi saat menggunakan libjq dengan thread, serta crash assert pada --jsonarg
  • CI, scan build, rilis, dan build situs web kini menggunakan GitHub Actions, dan OSS-Fuzz telah ditambahkan

1 komentar

 
GN⁺ 2023-09-07
Komentar Hacker News
  • Saya sangat menyukai JQ karena memang hebat
    Di produk kami (alat Kafka berbasis JVM dan browser), kami mengimplementasikan subset JQ di Clojure agar pengguna bisa memproses/memfilter data. Itu salah satu pekerjaan paling menyenangkan di antara kode yang pernah saya tulis, dan karena saya memang suka menulis tata bahasa, saya juga sangat berterima kasih kepada Instaparse: https://github.com/Engelberg/instaparse
    Saat mengimplementasikannya, saya mengetahui bahwa JQ adalah LISP-2, dan terkejut karena dari sintaksnya saja tidak terasa seperti itu: https://github.com/jqlang/jq/wiki/jq-Language-Description#:~...

    • Saya benar-benar tidak bisa menyukai jq. Di codebase kantor, skrip bash juga banyak memakai jq, sebagian kodenya saya yang menulis, dan kalau memang itu pilihan terbaik saya tetap memakainya meski terpaksa
      Namun saya terganggu oleh sintaks kueri yang tidak intuitif, keharusan mencari-cari untuk setiap langkah yang sangat kecil, dan hasilnya yang tampak seperti mantra yang sulit diuraikan kalau bukan ahli jq. Secara naluriah saya punya penolakan terhadap DSL secara umum yang tertanam di dalam string, seperti htmx atau tailwind
      Meski begitu, saya mengakui ini software yang dibuat dengan baik, dan kadang memang tidak ada pilihan yang lebih baik. Saat menangani JSON di bash, ini juga pilihan yang paling tidak buruk dibanding monster sed/awk/cut. Hanya saja perintah jq yang selalu tertancap seperti string tak terbaca di tengah skrip, bersama regex, termasuk hal yang tidak ingin saya lihat di kode. Sebagai alternatif, saya pernah mencoba menyalurkan inline Python di dalam heredoc lewat pipe, tetapi itu juga jadi sama berantakannya dengan skrip jq
    • Saya juga menambahkan parser/tata bahasa JQ ke editor/penguji tata bahasa LALR(1)/FLEX online: https://mingodad.github.io/parsertl-playground/playground/
      Pilih "Jq parser (partially working)" di contoh lalu tekan "Parse" untuk melihat pohon parser bagi source di "Input source". Masukan selalu diterima
    • Di JVM sudah ada implementasi JQ. Belum 100% selesai, tetapi bisa digunakan: https://github.com/eiiches/jackson-jq
    • jq sangat bagus untuk membuat pengguna memproses data mereka sendiri. Kami juga memakai pendekatan serupa: membuat endpoint webhook masuk untuk pengguna, mengirim data JSON arbitrer, lalu memungkinkan mereka menyiapkan mapping yang berguna lengkap dengan regression test dan monitoring
      jq membuat sebagian besar kasus menjadi sederhana (pada dasarnya notasi titik JSON), sekaligus memungkinkan long tail kasus-kasus yang rumit
    • Kalau produknya sudah bisa digunakan, saya pasti ingin mencobanya
  • Saya suka jq, tetapi juga memakai JMESPath (terutama bersama AWS CLI), yq (termasuk tomlq dan xq), serta dasel. Sayang hclq praktis sudah mati
    https://jmespath.org/
    https://kislyuk.github.io/yq/
    https://github.com/TomWright/dasel
    https://hclq.sh/

    • Mari buat JSON bisa di-grep: https://github.com/tomnomnom/gron
      Saya sudah memakai jq selama bertahun-tahun dan selalu entah bagaimana bisa merangkai apa yang dibutuhkan, tetapi sampai sekarang belum pernah merasa itu intuitif. Begitu sedikit saja menjadi rumit, sulit mencapai solusi tanpa membaca dokumentasi cukup lama, dan saya berharap ini bisa lebih mudah dipakai
    • Halaman tutorial interaktif JMESPath benar-benar bagus: https://jmespath.org/tutorial.html
      Itu membantu saat pertama kali mempelajari sintaksnya, dan sekarang pun kalau tersandung sintaks yang aneh saya kembali membukanya
    • Saya membuat alat kecil untuk mengonversi berbagai format ke berbagai format
      Kegunaan terbesarnya adalah mengonversi hal-hal seperti CSV, TOML, XML menjadi JSON lalu menyalurkannya ke jq lewat pipe: https://github.com/sentriz/rsl
    • Sebagai alternatif, ada juga alat-alat seperti ini
      https://github.com/kellyjonbrazil/jello
      https://github.com/wwkimball/yamlpath
    • Alternatif bagus lainnya adalah JSONPath; sayang meski unggul, dukungan dan pengenalannya belum luas
      Karena terinspirasi dari XPath, ini terasa lebih familiar daripada DSL yang sama sekali baru, dan menurut saya fitur intinya adalah pencarian key rekursif. Jika menulis people..address, itu akan menemukan semua key "address" di bawah "people" di mana pun dalam JSON. Ini bahasa parsing favorit saya untuk JSON, dan saya juga menulis artikel yang memperkenalkan cara memakainya untuk parsing dataset JSON
      https://github.com/JSONPath-Plus/JSONPath
      https://scrapfly.io/blog/parse-json-jsonpath-python/
  • Jika Anda hanya sesekali memakai jq sehingga setiap kali harus melihat dokumentasi, gron layak dicoba. Ini JSON yang bisa di-grep
    https://github.com/tomnomnom/gron

    • Sederhana, tetapi tampaknya sangat berguna
      Selama beberapa tahun saya memakai curl cheat.sh/jq, dan menurut saya cheat.sh secara keseluruhan adalah referensi yang bagus. Kalau sekarang, mungkin saya akan memakai sesuatu seperti ChatGPT
    • Desainnya benar-benar bagus
      Pola seperti gron | grep | sed | gron -u juga memungkinkan
    • Saya selalu kesulitan dengan sintaks jq, tetapi tiap kali takjub karena ChatGPT cukup baik membuatkan perintah yang tepat jika diberi contoh JSON
  • Salah satu alasan saya menyukai jq, atau setidaknya bisa menoleransinya, adalah stabilitas. Skrip yang saya tulis beberapa tahun lalu masih bekerja persis sama sampai sekarang
    Sebaliknya, kode yang saya simpan untuk yq sering rusak karena yq terus diperbaiki dengan cara yang tidak kompatibel ke belakang. Saya tidak meneliti seberapa sering perubahan seperti itu terjadi, tetapi berkali-kali terdampak di tempat-tempat seperti skrip CI, yang versi alat bawaannya beragam dan laju pembaruannya juga berbeda-beda
    Karena itu saya selalu berterima kasih karena para maintainer jq memahami pentingnya kompatibilitas ke belakang. Semoga pengumuman kali ini bukan berarti stabilitas tersebut selama ini hanya efek samping kebetulan dari stagnasi, lalu stabilitas dikorbankan ketika stagnasi itu diperbaiki

  • Selain alat-alat mirip jq, ada alat menarik yang digunakan bersama jq, yaitu jo dan jc
    https://github.com/jpmens/jo
    https://github.com/kellyjonbrazil/jc

    • Ada juga jless dan gron
      Saya baru mendengar gron di sini, tetapi menambahkannya demi kelengkapan. Di sisi lain, JSON tampaknya makin menjadi format keluaran standar untuk alat CLI. Idealnya, semua alat CLI menyediakan flag seperti --json sehingga jc tidak lagi diperlukan
      https://jless.io/
      https://github.com/tomnomnom/gron
  • Tulisan terkait bulan lalu, "First release of jq in 5 years": https://news.ycombinator.com/item?id=36951830
    Saya penggemar berat jq dan selalu menggunakannya

  • Akhirnya berhasil
    Proses komunitas bekerja sama merekrut maintainer baru dan menghidupkan kembali proyek ini benar-benar keren. Terutama terima kasih khusus kepada @stedolan, @itchyny, dan @owenthereal berdasarkan nama pengguna GitHub

  • jq dan miller adalah perlengkapan wajib di toolbox saya, bersama awk dan vim
    https://github.com/johnkerl/miller

  • Fungsi bawaan baru pick(stream) menambahkan kemampuan untuk mengeluarkan proyeksi dari objek atau array input
    jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | pick(.a, .b.c, .x)'
    Ini benar-benar fitur penyelamat. Terima kasih kepada para kontributor

    • Kalau tidak perlu menggali terlalu dalam, bisa juga seperti ini
      $ jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | {a, e}'
      {
      "a": 1,
      "e": 4
      }
    • Beberapa hari lalu saya memasangnya dari Git untuk memakai fitur ini, dan sangat berguna
    • Ini fitur baru yang benar-benar hebat. Saat ini tampaknya mustahil tanpa terlebih dahulu menyusun ulang stream, jadi akan bagus jika ada versi pick yang juga bekerja pada data streaming
  • Saya juga ingin merekomendasikan jaq. Ini klon jq yang berfokus pada akurasi, kecepatan, dan kesederhanaan
    Hanya mengimplementasikan subset dari jq, tetapi sejauh ini saya cukup puas memakainya: https://github.com/01mf02/jaq