- 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
jqnicht 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
StreamDeserializerdeserialisieren 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
jqnicht selbst bereitstellen
- Nutzer müssen
- 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 jnvcat data.json | pixi exec jnvconda 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 | jnvjnv data.json
- In UNIX-Umgebungen kann beim Beenden das aktuelle Ergebnis nach stdout geschrieben werden
cat data.json | jnv --write-to-stdout | some-commandcat 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
- Wird nichts angegeben oder
- 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: BeendenCtrl + Q:jq-Filter in die Zwischenablage kopierenCtrl + O: JSON in die Zwischenablage kopierenShift + ↑,Shift + ↓: In einen anderen Modus wechseln
- Editor mode ist der Standardmodus
Tab: Vorschlag einfügen←,→: Cursor nach links/rechts bewegenCtrl + A,Ctrl + E: Zum Zeilenanfang bzw. Zeilenende bewegenBackspace: Zeichen vor dem Cursor löschenCtrl + U: Gesamte Zeile löschenAlt + B,Alt + F: Zur vorherigen bzw. nächsten Position anhand des nächstgelegenen Zeichens aus.,|,(,),[,]bewegenCtrl + W,Alt + D: Bis zur vorherigen bzw. nächsten Position anhand derselben Zeichenmenge löschen
- Im Zustand mit Autovervollständigungs-Vorschlägen wählt
Taboder↓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 bewegenCtrl + H: Zum letzten Eintrag bewegenCtrl + L: Zum ersten Eintrag bewegenEnter: Ein-/Ausklappen umschaltenCtrl + P: Alles ausklappenCtrl + 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
-coder--configVorrang, 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
- Linux:
- 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.tomlmuss 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_hintfestlegen - Editor-Einstellungen können getrennt nach fokussiertem und nicht fokussiertem Zustand angepasst werden
- Als Eingabemodi werden
InsertundOverwriteverwendet - Ü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
- Als Eingabemodi 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_streamsbegrenzt werden - Dieser Wert dient dazu, den Speicherverbrauch beim Umgang mit großen Datenströmen zu reduzieren; ohne Angabe gibt es keine Begrenzung
- Bei Stream-Eingaben kann die maximale Anzahl zu verarbeitender JSON-Objekte mit
- 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
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.
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.
https://github.com/TomConlin/json_to_paths
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.
Als Alternative sollten alle auch fx kennen.
Damit kann man deutlich mehr Dinge wie
map,filter,reducemachen, 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.
[0]: https://dev.to/pbnj/fzf-jq-interactive-jq-15no
Demo: https://asciinema.org/a/349330
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