3 điểm bởi GN⁺ 2023-09-07 | 1 bình luận | Chia sẻ qua WhatsApp
  • Đã loại bỏ tùy chọn --argfile, cùng với các bộ lọc leaf_pathsrecurse_down, vốn đã ngừng được hỗ trợ
  • Ảnh Docker hiện được cung cấp tại ghcr.io/jqlang/jq thay vì Docker Hub
  • Các mục tiêu build phát hành nêu rõ nhiều kiến trúc cho Linux, macOS, Windows và Docker
  • Đã bổ sung --raw-output0, cho phép chèn byte NUL giữa các đầu ra; việc xuất chuỗi có chứa NUL sẽ được xử lý như lỗi
  • Trên Windows, đã thêm tùy chọn --binary/-b để có thể xuất kết thúc dòng \n thay vì \r\n
  • Có thể thiết lập màu cho khóa đối tượng bằng JQ_COLORS, và việc xuất màu sẽ bị tắt nếu có biến môi trường NO_COLOR
  • Đã sửa vấn đề về mã thoát của tùy chọn --exit-code/-e: nếu giá trị đầu ra cuối cùng là đúng thì trả về 0, nếu là false hoặc null thì trả về 1, và nếu không có đầu ra thì trả về 4
  • Sử dụng literal số thập phân để bảo toàn độ chính xác của literal số; các phép so sánh tôn trọng độ chính xác này, nhưng phép toán số học có thể bị cắt bớt
  • Đã thêm các hàm tích hợp mới pick(stream), debug(msgs), scan($re; $flags), abs
  • Trong câu lệnh if, có thể bỏ qua nhánh else; else bị lược bỏ sẽ được xử lý như hành vi .
  • halthalt_error giờ sẽ kết thúc ngay lập tức thay vì tiếp tục sang đầu vào kế tiếp
  • Đã sửa lỗi biểu diễn số lớn tạo ra đầu ra JSON sai trên một số nền tảng, lỗi phân đoạn khi dùng libjq cùng luồng, và lỗi assert crash của --jsonarg
  • CI, scan build, phát hành và build website đã được chuyển sang dùng GitHub Actions, đồng thời bổ sung OSS-Fuzz

1 bình luận

 
GN⁺ 2023-09-07
Ý kiến trên Hacker News
  • Thực sự rất thích JQ vì nó tuyệt vời
    Trong sản phẩm của chúng tôi (công cụ Kafka dựa trên JVM và trình duyệt), chúng tôi đã triển khai một tập con của JQ bằng Clojure để người dùng có thể xử lý/lọc dữ liệu. Đó là một trong những việc thú vị nhất trong số các đoạn code tôi từng viết, và vì tôi vốn thích tự viết cú pháp, tôi cũng rất biết ơn Instaparse: https://github.com/Engelberg/instaparse
    Khi triển khai, tôi phát hiện JQ là LISP-2, điều này làm tôi ngạc nhiên vì chỉ nhìn cú pháp thì không có cảm giác như vậy: https://github.com/jqlang/jq/wiki/jq-Language-Description#:~...

    • Tôi không thể nào thích jq được. Trong codebase ở công ty có nhiều script bash dùng jq, một phần code là do tôi viết, và khi đó là lựa chọn tốt nhất thì tôi vẫn miễn cưỡng dùng
      Nhưng tôi khó chịu với cú pháp truy vấn không trực quan, việc phải tra cứu gần như ở từng bước rất nhỏ, và kết quả trông như thần chú mà nếu không phải chuyên gia jq thì rất khó giải mã. Tôi có cảm giác bài xích bản năng với các DSL nói chung bị nhét vào trong chuỗi, như htmx hay tailwind
      Dù vậy, tôi cũng thừa nhận đây là phần mềm được làm tốt, và đôi khi không có lựa chọn nào tốt hơn. Khi xử lý JSON trong bash, nó cũng là lựa chọn ít tệ nhất theo nghĩa tốt hơn nhiều so với những con quái vật sed/awk/cut. Chỉ là các lệnh jq lúc nào cũng cắm giữa script như một chuỗi không thể giải mã, cùng với regex, gần như là những thứ tôi không muốn thấy trong code. Tôi từng thử phương án thay thế là pipe inline Python trong heredoc, nhưng cách đó cũng trở nên bừa bộn chẳng kém script jq
    • Tôi cũng đã thêm parser/cú pháp JQ vào trình biên tập/kiểm thử cú pháp LALR(1)/FLEX trực tuyến: https://mingodad.github.io/parsertl-playground/playground/
      Chọn "Jq parser (partially working)" trong ví dụ rồi nhấn "Parse" để xem cây parser cho mã trong "Input source". Luôn hoan nghênh mọi phản hồi
    • Trên JVM đã có bản triển khai JQ. Chưa hoàn thiện 100% nhưng dùng được: https://github.com/eiiches/jackson-jq
    • jq rất phù hợp để cho người dùng tự xử lý dữ liệu của họ. Chúng tôi cũng dùng cách tương tự: cho người dùng tạo endpoint webhook đầu vào, gửi dữ liệu JSON tùy ý, rồi thiết lập các mapping hữu ích kèm kiểm thử hồi quy và giám sát
      jq làm cho phần lớn trường hợp trở nên đơn giản (về cơ bản là ký pháp dấu chấm của JSON), đồng thời vẫn xử lý được cái đuôi dài các trường hợp phức tạp
    • Nếu sản phẩm đã ở trạng thái có thể dùng được thì tôi rất muốn thử
  • Tôi thích jq, nhưng cũng dùng JMESPath (đặc biệt cùng với AWS CLI), yq (bao gồm cả tomlq và xq), và dasel. Tiếc là hclq gần như đã chết
    https://jmespath.org/
    https://kislyuk.github.io/yq/
    https://github.com/TomWright/dasel
    https://hclq.sh/

    • Hãy làm cho JSON có thể grep được: https://github.com/tomnomnom/gron
      Tôi đã dùng jq nhiều năm và lúc nào cũng bằng cách nào đó ghép được thứ mình cần, nhưng đến giờ vẫn chưa bao giờ thấy nó trực quan. Chỉ cần hơi phức tạp là khó tìm ra lời giải nếu không đọc tài liệu khá lâu, và tôi ước nó có thể dễ dùng hơn
    • Trang hướng dẫn tương tác JMESPath thực sự rất hay: https://jmespath.org/tutorial.html
      Nó đã giúp tôi khi mới học cú pháp, và đến giờ nếu vướng vào cú pháp lạ tôi vẫn quay lại xem
    • Tôi đã làm một công cụ nhỏ để chuyển đổi giữa nhiều định dạng
      Công dụng lớn nhất là chuyển những thứ như CSV, TOML, XML sang JSON rồi pipe vào jq: https://github.com/sentriz/rsl
    • Ngoài ra cũng có những công cụ thay thế này
      https://github.com/kellyjonbrazil/jello
      https://github.com/wwkimball/yamlpath
    • Một lựa chọn thay thế tuyệt vời khác là JSONPath, rất đáng tiếc là dù xuất sắc nhưng mức độ hỗ trợ và nhận biết chưa rộng
      Lấy cảm hứng từ XPath nên quen thuộc hơn so với một DSL hoàn toàn mới, và tôi cho rằng tính năng cốt lõi là truy vấn khóa đệ quy. Viết people..address sẽ tìm mọi khóa "address" nằm dưới "people" ở bất cứ đâu trong JSON. Đây là ngôn ngữ phân tích cú pháp cho JSON mà tôi thích nhất, và tôi cũng đã viết một bài giới thiệu cách dùng nó để phân tích tập dữ liệu JSON
      https://github.com/JSONPath-Plus/JSONPath
      https://scrapfly.io/blog/parse-json-jsonpath-python/
  • Nếu chỉ thỉnh thoảng mới dùng jq nên lần nào cũng phải xem tài liệu, gron rất đáng thử. Đó là JSON có thể grep được
    https://github.com/tomnomnom/gron

    • Đơn giản nhưng trông cực kỳ hữu ích
      Tôi đã dùng curl cheat.sh/jq suốt vài năm, và thấy cheat.sh nói chung là một nguồn tài liệu tuyệt vời. Nếu là bây giờ thì có lẽ tôi sẽ dùng thứ gì đó như ChatGPT
    • Thiết kế thật sự rất tốt
      Cũng có thể làm kiểu gron | grep | sed | gron -u
    • Tôi luôn vật lộn với cú pháp jq, nhưng lần nào cũng ngạc nhiên vì ChatGPT tạo ra lệnh đúng khá tốt nếu đưa cho nó JSON ví dụ
  • Một trong những lý do khiến tôi thích, hoặc có thể chịu được jq, là tính ổn định. Các script viết từ vài năm trước đến giờ vẫn chạy y như cũ
    Ngược lại, code tôi để dành cho yq thường xuyên bị hỏng khi yq liên tục được cải tiến theo những cách không tương thích ngược. Tôi chưa điều tra xem các thay đổi như vậy xảy ra thường xuyên đến mức nào, nhưng đã bị ảnh hưởng nhiều lần ở những nơi như script CI, nơi phiên bản công cụ mặc định mỗi nơi một khác và tốc độ cập nhật cũng khác nhau
    Vì vậy tôi luôn biết ơn các maintainer của jq vì họ hiểu tầm quan trọng của tương thích ngược. Hy vọng thông báo lần này không có nghĩa là sự ổn định đó chỉ là sản phẩm phụ tình cờ của tình trạng trì trệ, và khi khắc phục sự trì trệ thì sẽ hy sinh tính ổn định

  • Ngoài các công cụ giống jq, còn có những công cụ thú vị dùng cùng jq là jojc
    https://github.com/jpmens/jo
    https://github.com/kellyjonbrazil/jc

    • Cũng có jlessgron
      Tôi mới nghe đến gron lần đầu ở đây, nhưng thêm vào cho đầy đủ. Mặt khác, có vẻ JSON đang dần trở thành định dạng xuất chuẩn của các công cụ CLI. Lý tưởng nhất là mọi công cụ CLI đều cung cấp một flag như --json, để jc không còn cần thiết nữa
      https://jless.io/
      https://github.com/tomnomnom/gron
  • Bài liên quan tháng trước “First release of jq in 5 years”: https://news.ycombinator.com/item?id=36951830
    Tôi là fan cuồng của jq và lúc nào cũng dùng nó

  • Cuối cùng cũng xong
    Quá trình cộng đồng chung sức tuyển maintainer mới và hồi sinh dự án thật sự rất tuyệt. Đặc biệt cảm ơn @stedolan, @itchyny, @owenthereal theo username GitHub

  • jq và miller là những món không thể thiếu trong bộ công cụ của tôi, cùng với awk và vim
    https://github.com/johnkerl/miller

  • Hàm tích hợp mới pick(stream) thêm khả năng xuất ra projection của object hoặc array đầu vào
    jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | pick(.a, .b.c, .x)'
    Đây đúng là một tính năng cứu cánh. Cảm ơn các contributor

    • Nếu không cần đào sâu thì cũng có thể làm như sau
      $ jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | {a, e}'
      {
      "a": 1,
      "e": 4
      }
    • Vài ngày trước tôi đã cài từ Git để dùng tính năng này, và nó rất hữu ích
    • Đây là một tính năng mới thật sự tuyệt vời. Hiện tại có vẻ không thể làm được nếu không tái lắp ráp stream trước, nên sẽ rất tốt nếu có một phiên bản pick hoạt động được cả với dữ liệu streaming
  • Tôi cũng muốn giới thiệu jaq. Đây là một clone của jq tập trung vào độ chính xác, tốc độ và sự đơn giản
    Nó chỉ triển khai một tập con của jq, nhưng đến giờ tôi dùng khá hài lòng: https://github.com/01mf02/jaq