3 Punkte von GN⁺ 2024-03-20 | 1 Kommentare | Auf WhatsApp teilen
  • jnv ist ein Tool zum Navigieren in JSON und bietet einen interaktiven JSON-Viewer zusammen mit einem jq-Filtereditor
  • Für das Anwenden von Filtern wird jaq verwendet, sodass Nutzer jq nicht separat bereitstellen müssen
  • Als Eingabe werden Dateien und stdin unterstützt; neben einem einzelnen JSON können auch mehrere JSON-Strukturen wie JSON Lines verarbeitet werden, sofern sie sich mit StreamDeserializer deserialisieren lassen
  • Über eine TOML-Konfiguration lassen sich Hinweisanzeige, UI-Reaktionsfähigkeit, Editor-Verhalten, Stil des JSON-Viewers, Anzeige und Verhalten der Autovervollständigung sowie Key Bindings anpassen
  • Die Autovervollständigung unterstützt von den jq-Funktionen nur Identity, Object Identifier-Index und Array Index; in v0.7.0 hat sich die TOML-Konfigurationssyntax geändert, ein Migrationswerkzeug wird jedoch nicht bereitgestellt

Was jnv bietet

  • jnv ist ein interaktives Tool zum Navigieren in JSON und bietet einen JSON-Viewer sowie einen jq-Filtereditor
  • Auf JSON kann Syntax Highlighting angewendet werden
  • Zum Anwenden von jq-Filtern wird jaq verwendet
    • Nutzer müssen jq nicht selbst bereitstellen
  • Inspiriert von jid und jiq

Eingabeformat und Filterbearbeitung

  • Eingaben können aus einer Datei oder von stdin gelesen werden
  • Die Daten können aus einem einzelnen JSON oder aus mehreren JSON-Strukturen bestehen
    • Mehrere JSON-Strukturen müssen in einem Format vorliegen, das sich mit StreamDeserializer deserialisieren lässt
    • Dazu gehören beispielsweise JSON Lines
  • Filter-Autovervollständigung wird eingeschränkt unterstützt
  • Zur Unterstützung der Filterauswertung können Hinweismeldungen angezeigt werden

Installation

  • Installation über Homebrew möglich
    • brew install jnv
    • oder brew install ynqa/tap/jnv
  • Installation über MacPorts möglich
    • sudo port install jnv
  • Nutzbar unter Nix / NixOS
    • nix-shell -p jnv
  • Installation oder Ausführung über conda-forge möglich
    • pixi global install jnv
    • cat data.json | pixi exec jnv
    • conda install jnv
  • Für Docker wird ein Beispiel zum Erstellen und Ausführen eines eigenen Images bereitgestellt
    • Es wird darauf hingewiesen, dass das Image in naher Zukunft in einer Registry bereitgestellt werden soll
  • Installation über Cargo möglich
    • cargo install jnv

Nutzungsbeispiele und CLI-Optionen

  • Ausführung mit Datei oder Standardeingabe möglich
    • cat data.json | jnv
    • jnv data.json
  • In UNIX-Umgebungen kann beim Beenden das aktuelle Ergebnis nach stdout geschrieben werden
    • cat data.json | jnv --write-to-stdout | some-command
    • cat data.json | jnv -- --write-to-stdout > result.json
  • Die grundlegende Nutzungsform ist jnv [OPTIONS] [INPUT]
  • [INPUT] ist ein optionaler Pfad zu einer JSON-Datei
    • Wird nichts angegeben oder - verwendet, wird von der Standardeingabe gelesen
  • Die wichtigsten Optionen sind:
    • -c, --config <CONFIG_FILE>: Pfad zur Konfigurationsdatei angeben
    • --default-filter <DEFAULT_FILTER>: Standard-jq-Filter festlegen, der auf die Eingabedaten angewendet wird
    • --write-to-stdout: Beim Beenden das aktuelle JSON-Ergebnis nach stdout ausgeben
    • -h, --help: Hilfe ausgeben
    • -V, --version: Version ausgeben

Tastenbedienung

  • Gemeinsame Key Bindings stellen grundlegende Aktionen für Editor und JSON-Viewer bereit
    • Ctrl + C: Beenden
    • Ctrl + Q: jq-Filter in die Zwischenablage kopieren
    • Ctrl + O: JSON in die Zwischenablage kopieren
    • Shift + ↑, Shift + ↓: In einen anderen Modus wechseln
  • Editor mode ist der Standardmodus
    • Tab: Vorschlag einfügen
    • , : Cursor nach links/rechts bewegen
    • Ctrl + A, Ctrl + E: Zum Zeilenanfang bzw. Zeilenende bewegen
    • Backspace: Zeichen vor dem Cursor löschen
    • Ctrl + U: Gesamte Zeile löschen
    • Alt + B, Alt + F: Zur vorherigen bzw. nächsten Position anhand des nächstgelegenen Zeichens aus ., |, (, ), [, ] bewegen
    • Ctrl + W, Alt + D: Bis zur vorherigen bzw. nächsten Position anhand derselben Zeichenmenge löschen
  • Im Zustand mit Autovervollständigungs-Vorschlägen wählt Tab oder den nächsten Vorschlag aus, den vorherigen
  • JSON viewer mode bietet JSON-Navigation und Steuerung des Ein-/Ausklappens
    • , Ctrl + K: Nach oben bewegen
    • , Ctrl + J: Nach unten bewegen
    • Ctrl + H: Zum letzten Eintrag bewegen
    • Ctrl + L: Zum ersten Eintrag bewegen
    • Enter: Ein-/Ausklappen umschalten
    • Ctrl + P: Alles ausklappen
    • Ctrl + N: Alles einklappen

TOML-Konfiguration

  • jnv passt verschiedene Funktionen über eine TOML-Konfigurationsdatei an
  • Beim Laden der Konfigurationsdatei hat zuerst der per Kommandozeile angegebene Pfad mit -c oder --config Vorrang, danach der Standardpfad für die Konfigurationsdatei
  • Der Standardort der Konfigurationsdatei unterscheidet sich je nach Plattform
    • Linux: ~/.config/jnv/config.toml
    • macOS: ~/Library/Application Support/jnv/config.toml
    • Windows: C:\Users\{Username}\AppData\Roaming\jnv\config.toml
  • Wenn keine Konfigurationsdatei vorhanden ist, wird sie beim ersten Start automatisch erzeugt
  • In v0.7.0 hat sich die TOML-Konfigurationssyntax, etwa in default.toml, geändert; die Beispiele spiegeln das neue Format wider
    • Für diese Änderung wird kein Migrationswerkzeug bereitgestellt
    • Die lokale config.toml muss manuell ersetzt oder aktualisiert werden, sodass sie zur neuen Syntax passt
  • Je nach Terminaltyp und Umgebung werden Zeichen und Stile möglicherweise nicht korrekt angezeigt
    • Bestimmte Key Bindings und Zierzeichen werden in einigen Terminal-Emulatoren möglicherweise nicht angezeigt oder funktionieren dort nicht

Anpassbare Konfigurationsoptionen

  • Ob Hinweismeldungen ausgeblendet werden, lässt sich über no_hint festlegen
  • Editor-Einstellungen können getrennt nach fokussiertem und nicht fokussiertem Zustand angepasst werden
    • Als Eingabemodi werden Insert und Overwrite verwendet
    • Über eine Liste von Wortgrenzen-Zeichen lassen sich Cursorbewegung und Löschverhalten festlegen
    • Präfix-Anzeigezeichen, Präfix-Stil, Stil des Zeichens unter dem Cursor und Stil der übrigen Zeichen können angegeben werden
  • Die JSON-Anzeigeeinstellungen umfassen Einrückung, Klammerstil, Stil von Schlüsseln und Werten, Attribute der ausgewählten Zeile sowie den Umgang mit Breitenüberschreitung
    • Bei Stream-Eingaben kann die maximale Anzahl zu verarbeitender JSON-Objekte mit max_streams begrenzt werden
    • Dieser Wert dient dazu, den Speicherverbrauch beim Umgang mit großen Datenströmen zu reduzieren; ohne Angabe gibt es keine Begrenzung
  • Einstellungen für die Autovervollständigung passen die Chunk-Größe für Suchergebnisse und Hintergrundladen an
    • Größere Werte können die Ergebnisanzeige oder den Abschluss des Ladens beschleunigen, können aber mehr Speicher verbrauchen
  • Key Bindings lassen sich für Beenden, Kopieren der Query, Kopieren des Ergebnisses, Moduswechsel, Editor-Bedienung und JSON-Viewer-Bedienung konfigurieren
  • Einstellungen zur UI-Reaktionsfähigkeit passen die Verzögerung bei der Eingabeverarbeitung, die Verzögerung beim Neuzeichnen nach einer Größenänderung des Fensters sowie das Intervall der Spinner-Animation an

1 Kommentare

 
GN⁺ 2024-03-20
Hacker-News-Kommentare
  • Cool. Ein kleiner Wermutstropfen ist, dass es selbst bei mittelgroßen JSON-Dateien (16 MB) sehr langsam ist und die Schriftfarbe zu dunkel ist (PR geschickt).
    Auf der Suche nach einer performanten Alternative bin ich auf fx (https://fx.wtf) gestoßen; es hat keine jq-Funktionen, ist aber ein schneller JSON-Viewer.

    • Wenn „selbst 16 MB JSON ist sehr langsam“ stimmt, ist aqny wohl aus Spaß hier vorbeigekommen und hat direkt Arbeit gefunden. Performance-Probleme anzugehen macht am meisten Spaß.
    • Bei der Arbeit müssen wir JSON-Dateien ab 50 MB handhaben; es wäre wirklich gut, wenn jnv diese Größenordnung verarbeiten könnte.
  • Sieht cool aus. Was mich an jq immer frustriert hat, war, dass man vor der Ausführung nicht sehen kann, welche Daten man am Ende bekommt.

  • Darauf freue ich mich wirklich. Werde ich mir auf jeden Fall ansehen.
    Bisher habe ich für interaktive Queries jq zusammen mit up [0] verwendet, aber die User Experience von up hat mir nicht besonders gefallen. Vor allem bei langen Queries oder Nicht-ASCII-Daten ist es unpraktisch, daher hätte ich gern eine Alternative.
    [0]: https://github.com/akavel/up

  • Wirklich gut. Sobald ich meinen Laptop in die Finger bekomme, installiere ich es sofort.
    Ich hatte früher einmal etwas Ähnliches gebaut, deshalb hat mich dieser Beitrag sofort angesprochen.
    https://github.com/bigH/interactively.git
    Ich frage mich, ob man diese Idee weiter verallgemeinern könnte, um mehr Befehlen im CLI eine interaktive Oberfläche zu geben. Schon lange stelle ich mir einen „Command Builder“ vor, der je nach Cursorposition passende Dokumentation lädt und sie während der Bearbeitung der Kommandozeile anzeigt.

  • Sehr cool. Ich weiß nicht, ob das zu viel verlangt ist, aber ich frage mich, ob man es so anpassen könnte, dass es auch mit OjG funktioniert, das statt jq-Syntax JSONPath verwendet. Falls das okay ist, würde ich gern helfen.

  • Sieht gut aus. Es scheint jless (https://github.com/PaulJuliusMartinez/jless) ziemlich nahezukommen.

    • jless scheint das Ergebnis nicht als jq-Query zu kopieren.
  • Als Alternative sollten alle auch fx kennen.
    Damit kann man deutlich mehr Dinge wie map, filter, reduce machen, und die Semantik ist näher an dem, was einem ohnehin vertraut ist. YAML wird ebenfalls unterstützt.
    https://fx.wtf/getting-started

  • Auf der Suche nach einem Tool zum dynamischen Filtern und Anzeigen von JSONL-Logdateien bin ich bei VisiData gelandet.
    Wenn ihr mit JSONL (JSON Lines) arbeitet, kann ich es sehr empfehlen.

  • Ich dachte, das müsste doch auch nur mit fzf möglich sein.

  • Wenn ihr Sublime Text nutzt, gibt es auch ein Plugin, das dasselbe kann [0].
    Zur Info: Dieses Plugin habe ich damals erstellt.
    [0]: https://packagecontrol.io/packages/Jq