3 Punkte von GN⁺ 2023-11-30 | 1 Kommentare | Auf WhatsApp teilen

Einführung in jaq

  • jaq ist ein Klon von jq, einem Werkzeug zur Verarbeitung von JSON-Daten, und hat das Ziel, einen großen Teil der jq-Syntax und -Operationen zu unterstützen.
  • Die drei Hauptziele von jaq sind Genauigkeit, Performance und Einfachheit.
  • Es soll bei gleichzeitiger Wahrung der Kompatibilität mit jq eine genauere und besser vorhersehbare Implementierung bieten.
  • Beispiele für unerwartetes Verhalten von jq sind, dass nan > nan falsch ist und nan < nan wahr ist, sowie dass bei der Ausführung von jq mit [[[]] | implode ein Absturz auftritt.
  • Es wurde als Lösung für die lange Startzeit von jq entwickelt und bietet eine etwa 30-mal schnellere Startzeit als jq 1.6.
  • jaq strebt eine einfache und kleine Implementierung an, um die Wahrscheinlichkeit von Bugs zu verringern und Beiträge zu erleichtern.

Installation

Installation aus dem Quellcode

  • Zum Kompilieren von jaq wird eine Rust-Toolchain benötigt.
  • Der in Linux-Distributionen enthaltene Rust-Compiler kann veraltet sein und sich daher möglicherweise nicht zum Kompilieren von jaq eignen.
  • jaq kann mit den Befehlen cargo install --locked jaq oder cargo install --locked --git https://github.com/01mf02/jaq installiert werden.
  • jaq sollte auf allen Systemen funktionieren, die von Rust unterstützt werden; falls nicht, sollte ein Issue erstellt werden.

Installation per Binärdatei

  • Unter macOS oder Linux kann jaq mit Homebrew installiert werden.

Beispiele

  • Die folgenden Beispiele zeigen, was jaq derzeit leisten kann.
  • Wenn echo '{"a": 1, "b": 2}' | jaq '.a' ausgeführt wird, wird 1 ausgegeben.
  • Wenn echo '{"a": 1, "b": 2}' | jaq 'add' ausgeführt wird, wird 3 ausgegeben.
  • Wenn echo '[0, 1, 2, 3]' | jaq 'map(.*2) | [.[] | select(. < 5)]' ausgeführt wird, wird [0, 2, 4] ausgegeben.

Performance

  • Mehrere Benchmarks vergleichen die Performance von jaq, jq und gojq.
  • Der Benchmark empty wird verwendet, um die Startzeit zu messen.
  • Im Benchmark bf-fib führt ein in jq geschriebener Brainfuck-Interpreter ein Brainfuck-Skript aus, das Fibonacci-Zahlen erzeugt.
  • Andere Benchmarks werten verschiedene Filter mit dem Eingabewert n aus.
  • Die Benchmark-Ergebnisse zeigen, dass jaq-1.2 in 16 Benchmarks am schnellsten ist, jq-1.7 in 2 und gojq-0.12.13 in 1 Benchmark.

Funktionen

Grundfunktionen

  • Es werden verschiedene Grundfunktionen unterstützt, darunter grundlegende Datentypen, Bedingungen, Zugriff, Operatoren, Fehlerbehandlung, String-Interpolation und Format-Strings.

Pfade

  • Unterstützt werden Array-/Objekt-Indizierung, Iteration, optionale Indizierung/Iteration, Array-Slices und String-Slices.

Operatoren

  • Unterstützt werden Operatoren für Komposition, Bindung, Verkettung, Zuweisung, Update-Zuweisung, Alternativen, Logik, Gleichheit und Vergleich, Arithmetik, Negation sowie Fehlerunterdrückung.

Definitionen

  • Unterstützt werden grundlegende Definitionen und rekursive Definitionen.

Kernfilter

  • Es werden verschiedene Kernfilter unterstützt.

Standardfilter

  • Standardfilter werden über grundlegendere Filter definiert.

Numerische Filter

  • Es werden viele aus libm übernommene Filter unterstützt.

Erweiterte Funktionen

  • Einige Funktionen von jq werden nicht unterstützt, zum Beispiel Module, SQL-ähnliche Operatoren und Streaming.

Unterschiede zwischen jq und jaq

Zahlen

  • jq verwendet für alle Zahlen 64-Bit-Gleitkommazahlen, während jaq zwischen Ganzzahlen und Gleitkommazahlen unterscheidet.

NaN und Unendlichkeit

  • jaq bietet ein Verhalten, das näher am IEEE-754-Standard für Gleitkomma-Arithmetik liegt.

Erhaltung gebrochener Zahlen

  • jaq bewahrt gebrochene Zahlen aus JSON-Daten vollständig.

Zuweisung

  • jaq interpretiert Zuweisungen anders als jq.

Definitionen

  • jaq erlaubt Filterdefinitionen und kann wie jq Argumente als Werte übergeben.

Argumente

  • jaq kann Argumente über die Kommandozeile definieren.

Falten

  • jaq bietet die Filter reduce und foreach und interpretiert sie anders als jq.

Fehlerbehandlung

  • jaq verwendet einen anderen Mechanismus zur Fehlerbehandlung als jq.

Sonstiges

  • Beim Slurping, kartesischen Produkt, Listen-Update, Einlesen von Eingaben, Join und weiteren Punkten zeigen jq und jaq unterschiedliches Verhalten.

Mitwirken

  • Beiträge zu jaq sind willkommen; nach Änderungen sollte geprüft werden, ob cargo test erfolgreich ausgeführt wird.

Danksagung

  • jaq profitiert stark von verschiedenen Bibliotheken und der Rust-Standardbibliothek.

Meinung von GN⁺

Das Wichtigste an diesem Artikel ist, dass jaq versucht, die meisten Funktionen von jq zu unterstützen und dabei gleichzeitig Performance und Genauigkeit zu verbessern. Besonders die im Vergleich zu jq deutlich schnellere Startzeit und der Versuch, unerwartetes Verhalten zu reduzieren, dürften für viele Nutzer interessant sein. Außerdem wird es auf Basis von Rust entwickelt, was auch bei Speichersicherheit und Performance Vorteile bietet. Diese Verbesserungen dürften jaq zu einem nützlichen Werkzeug für Softwareingenieure machen, die JSON-Daten verarbeiten müssen.

1 Kommentare

 
GN⁺ 2023-11-30
Hacker-News-Kommentare
  • [[[]] | implode-Bug und Unterbrechung der jq-Entwicklung

    • Die jq-Entwicklung war 5 Jahre lang unterbrochen und wurde erst kürzlich wieder aufgenommen, weshalb lange bekannte Bugs nicht behoben wurden. Mit der Wiederaufnahme der Entwicklung wird erwartet, dass sich die aufgelaufenen Probleme nach und nach lösen.
  • Dank für die Empfehlung anderer Projekte

    • Es ist großartig, wenn ein Projekt andere ähnliche oder inspirierende Projekte empfiehlt. Besonders die Entdeckung des Projekts jql wird positiv hervorgehoben.
  • Frage zum Vergleichsergebnis von nan > nan und nan < nan

    • Es wird infrage gestellt, ob es der Fließkomma-Norm IEEE 754 korrekt entspricht oder ein Bug ist, dass in jq nan > nan falsch und nan < nan wahr ist.
  • Problem bei der Darstellung von uint64-Zahlen in jq

    • Es wird Unmut darüber geäußert, dass jq uint64-Zahlen nicht korrekt darstellt.
  • Erfahrungsbericht zur Nutzung von DuckDB statt jq

    • jq ist zwar leistungsstark, aber wenn Daten tabellarisch vorliegen, fühlt sich die Verwendung von SQL natürlicher an.
  • Hinweis auf die vielen Abhängigkeiten von jaq

    • Es wird darauf hingewiesen, dass das Projekt jaq viele Abhängigkeiten hat.
  • Frage zur Nutzung von jq

    • Es wird gefragt, ob jq während der Entwicklung bzw. Datenanalyse zum Durchsuchen von JSON-Dateien verwendet wird oder in Programmen, die in Produktionsumgebungen laufen.
  • Erfahrungsbericht zur Nutzung von yq statt jq

    • Es wird berichtet, dass man angefangen hat, statt jq yq zu verwenden, und es werden Meinungen zu den wichtigsten Unterschieden zwischen den beiden Tools ausgetauscht.
  • Methode zum Abfragen von Daten in PowerShell

    • Mit PowerShell lassen sich alle Daten in Objekte umwandeln und mit der PowerShell-Syntax abfragen, ohne die Syntax verschiedener Tools wie jq oder xmlstarlet lernen zu müssen.
  • Meinung zur Schwierigkeit von jq-Syntax und Dokumentation

    • Es wird die Ansicht geäußert, dass jq-Syntax und Dokumentation schwer verständlich sind und sich dieser Punkt auch in neuen Versionen nicht verbessert hat. Es wird angedeutet, dass es möglicherweise besser sein könnte, etwas Eigenes zu schreiben.