3 điểm bởi GN⁺ 2023-11-30 | 1 bình luận | Chia sẻ qua WhatsApp

Giới thiệu về jaq

  • jaq là bản sao của jq, công cụ xử lý dữ liệu JSON, với mục tiêu hỗ trợ phần lớn cú pháp và phép toán của jq.
  • Ba mục tiêu chính của jaq là độ chính xác, hiệu năngsự đơn giản.
  • Dự án hướng tới việc duy trì khả năng tương thích với jq đồng thời cung cấp một cách triển khai chính xác và dễ dự đoán hơn.
  • Ví dụ về các hành vi khó lường của jq gồm việc nan > nan là sai còn nan < nan lại là đúng, và việc chạy jq với [[[]] | implode gây sập.
  • jaq được phát triển như một giải pháp cho thời gian khởi động dài của jq, với thời gian khởi động nhanh hơn khoảng 30 lần so với jq 1.6.
  • jaq hướng tới một triển khai đơn giản và nhỏ gọn để giảm khả năng phát sinh lỗi và giúp việc đóng góp trở nên dễ dàng hơn.

Cách cài đặt

Cài đặt từ mã nguồn

  • Cần có bộ công cụ Rust để biên dịch jaq.
  • Trình biên dịch Rust đi kèm trong các bản phân phối Linux có thể đã quá cũ và không phù hợp để biên dịch jaq.
  • Có thể cài đặt jaq bằng lệnh cargo install --locked jaq hoặc cargo install --locked --git https://github.com/01mf02/jaq.
  • jaq được kỳ vọng sẽ hoạt động trên mọi hệ thống mà Rust hỗ trợ; nếu không, nên tạo issue.

Cài đặt bản nhị phân

  • Có thể cài đặt jaq bằng homebrew trên macOS hoặc Linux.

Ví dụ

  • Các ví dụ sau cho thấy những gì jaq hiện có thể làm.
  • Chạy echo '{"a": 1, "b": 2}' | jaq '.a' sẽ in ra 1.
  • Chạy echo '{"a": 1, "b": 2}' | jaq 'add' sẽ in ra 3.
  • Chạy echo '[0, 1, 2, 3]' | jaq 'map(.*2) | [.[] | select(. < 5)]' sẽ in ra [0, 2, 4].

Hiệu năng

  • Hiệu năng của jaq, jq và gojq được so sánh qua nhiều benchmark.
  • Benchmark empty được dùng để đo thời gian khởi động.
  • Benchmark bf-fib chạy một script Brainfuck tạo dãy Fibonacci bằng một trình thông dịch Brainfuck viết bằng jq.
  • Các benchmark khác đánh giá nhiều bộ lọc khác nhau với giá trị đầu vào n.
  • Kết quả benchmark cho thấy jaq-1.2 nhanh nhất trong 16 benchmark, jq-1.7 nhanh nhất trong 2 benchmark, còn gojq-0.12.13 nhanh nhất trong 1 benchmark.

Tính năng

Tính năng cơ bản

  • Hỗ trợ nhiều tính năng cơ bản như kiểu dữ liệu nền tảng, câu lệnh điều kiện, truy cập, toán tử, xử lý lỗi, nội suy chuỗi, chuỗi định dạng và hơn thế nữa.

Đường dẫn

  • Hỗ trợ lập chỉ mục mảng/đối tượng, lặp, lập chỉ mục/lặp tùy chọn, cắt lát mảng và cắt lát chuỗi.

Toán tử

  • Hỗ trợ các toán tử như kết hợp, binding, nối, gán, gán cập nhật, thay thế, logic, bằng nhau và so sánh, số học, phủ định và chặn lỗi.

Định nghĩa

  • Hỗ trợ định nghĩa cơ bản và định nghĩa đệ quy.

Bộ lọc cốt lõi

  • Hỗ trợ nhiều bộ lọc cốt lõi khác nhau.

Bộ lọc tiêu chuẩn

  • Các bộ lọc tiêu chuẩn được định nghĩa thông qua những bộ lọc cơ bản hơn.

Bộ lọc số

  • Hỗ trợ nhiều bộ lọc lấy từ libm.

Tính năng nâng cao

  • Không hỗ trợ một số tính năng của jq, chẳng hạn như module, toán tử kiểu SQL, streaming, v.v.

Sự khác biệt giữa jq và jaq

Số

  • jq sử dụng số dấu phẩy động 64 bit cho mọi số, trong khi jaq phân biệt giữa số nguyên và số dấu phẩy động.

NaN và vô cực

  • jaq cung cấp hành vi gần hơn với chuẩn số học dấu phẩy động IEEE 754.

Bảo toàn số thập phân

  • jaq bảo toàn hoàn toàn các số thập phân đến từ dữ liệu JSON.

Gán

  • jaq diễn giải phép gán khác với jq.

Định nghĩa

  • jaq cho phép định nghĩa bộ lọc và có thể truyền đối số theo giá trị giống như jq.

Đối số

  • jaq có thể định nghĩa đối số qua dòng lệnh.

Gấp

  • jaq cung cấp các bộ lọc reduceforeach, với cách diễn giải khác jq.

Xử lý lỗi

  • jaq sử dụng cơ chế xử lý lỗi khác với jq.

Khác

  • jq và jaq có hành vi khác nhau ở các khía cạnh như slurping, tích Descartes, cập nhật danh sách, đọc đầu vào, join, v.v.

Đóng góp

  • Hoan nghênh đóng góp cho jaq, và cần đảm bảo cargo test chạy thành công sau khi thay đổi.

Lời cảm ơn

  • jaq hưởng lợi rất nhiều nhờ nhiều thư viện và thư viện chuẩn Rust.

Ý kiến của GN⁺

Điểm quan trọng nhất trong bài viết này là jaq đang cố gắng cải thiện hiệu năng và độ chính xác trong khi vẫn hỗ trợ phần lớn tính năng của jq. Đặc biệt, thời gian khởi động nhanh vượt trội so với jq và nỗ lực giảm các hành vi khó lường có thể sẽ hấp dẫn nhiều người dùng. Ngoài ra, việc được phát triển trên nền Rust cũng mang lại lợi thế về an toàn bộ nhớ và hiệu năng. Những cải tiến này được kỳ vọng sẽ biến nó thành một công cụ hữu ích cho các kỹ sư phần mềm cần xử lý dữ liệu JSON.

1 bình luận

 
GN⁺ 2023-11-30
Ý kiến trên Hacker News
  • Lỗi [[[]] | implode và việc phát triển jq bị gián đoạn

    • jq đã bị ngừng phát triển trong 5 năm rồi mới được khởi động lại gần đây, nên nhiều lỗi đã được biết đến từ lâu vẫn chưa được sửa. Với việc phát triển được nối lại, có thể kỳ vọng các vấn đề tích tụ lâu nay sẽ dần được giải quyết.
  • Cảm ơn vì đã giới thiệu các dự án khác

    • Thật tuyệt khi một dự án giới thiệu những dự án khác có điểm tương đồng hoặc đã truyền cảm hứng cho nó. Đặc biệt vui vì đã biết đến dự án jql.
  • Thắc mắc về kết quả so sánh nan > nannan < nan

    • Có ý kiến đặt câu hỏi liệu việc nan > nan là sai còn nan < nan là đúng trong jq có thực sự tuân thủ chặt chẽ chuẩn số thực dấu phẩy động IEEE 754 hay chỉ là lỗi.
  • Vấn đề hiển thị số uint64 của jq

    • Bày tỏ sự khó chịu về việc jq không hiển thị đúng các số uint64.
  • Chia sẻ trải nghiệm dùng DuckDB thay cho jq

    • jq rất mạnh, nhưng khi dữ liệu ở dạng bảng thì dùng SQL lại cho cảm giác tự nhiên hơn.
  • Chỉ ra rằng jaq có nhiều phụ thuộc

    • Có ý kiến chỉ ra rằng dự án jaq có khá nhiều dependency.
  • Câu hỏi về cách sử dụng jq

    • Hỏi liệu jq được dùng để khám phá các tệp JSON trong quá trình phát triển/phân tích dữ liệu, hay được dùng trong các chương trình chạy ở môi trường production.
  • Chia sẻ trải nghiệm dùng yq thay cho jq

    • Đã bắt đầu dùng yq thay cho jq, đồng thời trao đổi ý kiến về những khác biệt chính giữa hai công cụ.
  • Cách truy vấn dữ liệu trong PowerShell

    • Nếu dùng PowerShell, có thể chuyển mọi dữ liệu thành object và truy vấn bằng cú pháp PowerShell, không cần phải học cú pháp của nhiều công cụ khác nhau như jq hay xmlstarlet.
  • Ý kiến về sự khó hiểu của cú pháp và tài liệu jq

    • Có cảm giác cú pháp và tài liệu của jq khá khó hiểu, và cho rằng ngay cả ở phiên bản mới điều này cũng chưa được cải thiện. Thậm chí còn gợi ý rằng có khi tự viết còn tốt hơn.