3 points par GN⁺ 2024-03-20 | 1 commentaires | Partager sur WhatsApp
  • jnv est un outil conçu pour explorer du JSON, qui combine un visualiseur JSON interactif et un éditeur de filtres jq
  • Il utilise jaq pour appliquer les filtres, donc l’utilisateur n’a pas besoin d’installer jq séparément
  • L’entrée peut provenir d’un fichier ou de stdin, et l’outil peut traiter non seulement un JSON unique mais aussi plusieurs structures JSON comme les JSON Lines pouvant être désérialisées avec StreamDeserializer
  • La configuration TOML permet d’ajuster l’affichage des indications, la réactivité de l’interface, le comportement de l’éditeur, le style du visualiseur JSON, l’affichage et le comportement de l’autocomplétion, ainsi que les raccourcis clavier
  • L’autocomplétion ne prend en charge que certaines fonctionnalités de jq : Identity, Object Identifier-Index et Array Index ; la syntaxe de configuration TOML a changé en v0.7.0, mais aucun outil de migration n’est fourni

Fonctionnalités proposées par jnv

  • jnv est un outil interactif pour explorer du JSON, avec un visualiseur JSON et un éditeur de filtres jq
  • Le JSON peut bénéficier de la coloration syntaxique
  • L’application des filtres jq repose sur jaq
    • L’utilisateur n’a pas besoin de préparer jq lui-même
  • Inspiré de jid et jiq

Formats d’entrée et édition des filtres

  • L’entrée peut être lue depuis un fichier ou depuis stdin
  • Les données peuvent être un JSON unique ou plusieurs structures JSON
  • L’autocomplétion des filtres est prise en charge de façon limitée
  • Des messages d’aide peuvent être affichés pour faciliter l’évaluation des filtres

Méthodes d’installation

  • Installation possible avec Homebrew
    • brew install jnv
    • ou brew install ynqa/tap/jnv
  • Installation possible avec MacPorts
    • sudo port install jnv
  • Disponible sur Nix / NixOS
    • nix-shell -p jnv
  • Installation ou exécution possible via conda-forge
    • pixi global install jnv
    • cat data.json | pixi exec jnv
    • conda install jnv
  • Docker fournit un exemple pour construire puis exécuter l’image directement
    • Il est indiqué que l’image devrait être disponible prochainement dans un registre
  • Installation possible avec Cargo
    • cargo install jnv

Exemples d’utilisation et options CLI

  • Exécution possible à partir d’un fichier ou de l’entrée standard
    • cat data.json | jnv
    • jnv data.json
  • En environnement UNIX, il est possible d’écrire le résultat courant vers stdout à la fermeture
    • cat data.json | jnv --write-to-stdout | some-command
    • cat data.json | jnv -- --write-to-stdout > result.json
  • La forme d’utilisation par défaut est jnv [OPTIONS] [INPUT]
  • [INPUT] correspond à un chemin de fichier JSON optionnel
    • S’il n’est pas spécifié, ou si - est indiqué, la lecture se fait depuis l’entrée standard
  • Principales options
    • -c, --config <CONFIG_FILE> : spécifie le chemin du fichier de configuration
    • --default-filter <DEFAULT_FILTER> : spécifie le filtre jq par défaut à appliquer aux données d’entrée
    • --write-to-stdout : écrit le résultat JSON courant sur stdout à la fermeture
    • -h, --help : affiche l’aide
    • -V, --version : affiche la version

Raccourcis clavier

  • Les raccourcis communs fournissent le comportement de base dans l’éditeur et le visualiseur JSON
    • Ctrl + C : quitter
    • Ctrl + Q : copier le filtre jq dans le presse-papiers
    • Ctrl + O : copier le JSON dans le presse-papiers
    • Shift + ↑, Shift + ↓ : basculer vers un autre mode
  • Le mode Editor est le mode par défaut
    • Tab : insérer une suggestion
    • , : déplacer le curseur à gauche ou à droite
    • Ctrl + A, Ctrl + E : aller au début ou à la fin de la ligne
    • Backspace : supprimer le caractère avant le curseur
    • Ctrl + U : supprimer toute la ligne
    • Alt + B, Alt + F : se déplacer à la position précédente ou suivante en se basant sur le caractère le plus proche parmi ., |, (, ), [, ]
    • Ctrl + W, Alt + D : supprimer jusqu’à la position précédente ou suivante selon le même ensemble de caractères
  • Lorsqu’une suggestion d’autocomplétion est active, Tab ou sélectionne la suggestion suivante, et sélectionne la précédente
  • Le mode JSON viewer permet de parcourir le JSON et de contrôler le repliage
    • , Ctrl + K : monter
    • , Ctrl + J : descendre
    • Ctrl + H : aller au dernier élément
    • Ctrl + L : aller au premier élément
    • Enter : activer/désactiver le repliage
    • Ctrl + P : tout déplier
    • Ctrl + N : tout replier

Configuration TOML

  • jnv permet de personnaliser de nombreuses fonctionnalités via un fichier de configuration TOML
  • L’ordre de priorité pour le chargement du fichier de configuration est le suivant : d’abord le chemin indiqué en ligne de commande avec -c ou --config, puis le chemin par défaut
  • L’emplacement du fichier de configuration par défaut varie selon la plateforme
    • Linux : ~/.config/jnv/config.toml
    • macOS : ~/Library/Application Support/jnv/config.toml
    • Windows : C:\Users\{Username}\AppData\Roaming\jnv\config.toml
  • Si le fichier de configuration n’existe pas, il est créé automatiquement au premier lancement
  • En v0.7.0, la syntaxe de configuration TOML, comme default.toml, a changé, et les exemples reflètent le nouveau format
    • Aucun outil de migration n’est fourni pour ce changement
    • Le config.toml local doit être remplacé ou mis à jour manuellement pour correspondre à la nouvelle syntaxe
  • Selon le terminal et l’environnement, certains caractères et styles peuvent ne pas s’afficher correctement
    • Certains raccourcis clavier et caractères décoratifs peuvent ne pas s’afficher ou ne pas fonctionner dans certains émulateurs de terminal

Paramètres configurables

  • Il est possible de définir no_hint pour masquer les messages d’aide
  • Les paramètres de l’éditeur peuvent être ajustés séparément selon qu’il a le focus ou non
    • Les modes de saisie utilisés sont Insert et Overwrite
    • Une liste de caractères de délimitation de mots peut être définie pour contrôler les déplacements du curseur et les suppressions
    • Il est possible de définir le caractère de préfixe, le style du préfixe, le style du caractère sous le curseur et le style des autres caractères
  • Les paramètres d’affichage JSON incluent l’indentation, le style des accolades, le style des clés et des valeurs, les attributs de la ligne sélectionnée, ainsi que la gestion du dépassement de largeur
    • Pour les entrées en flux, max_streams permet de limiter le nombre maximal d’objets JSON à traiter
    • Ce paramètre sert à réduire l’usage mémoire lors du traitement de gros flux de données et, s’il n’est pas défini, aucune limite n’est appliquée
  • Les paramètres d’autocomplétion permettent d’ajuster la taille des blocs pour les résultats de recherche et le chargement en arrière-plan
    • Plus la valeur est grande, plus l’affichage des résultats ou la fin du chargement peuvent être rapides, mais avec une consommation mémoire plus élevée
  • Les raccourcis clavier sont configurables pour quitter, copier la requête, copier le résultat, changer de mode, manipuler l’éditeur et manipuler le visualiseur JSON
  • Les paramètres de réactivité de l’interface permettent d’ajuster le délai de traitement des entrées, le délai de redessin après redimensionnement de la fenêtre et l’intervalle d’animation du spinner

1 commentaires

 
GN⁺ 2024-03-20
Commentaires sur Hacker News
  • Super. Un petit bémol : c’est très lent même avec un JSON de taille moyenne (16 Mo), et les couleurs de police sont trop sombres (PR envoyé)
    En cherchant une alternative performante, je suis tombé sur fx (https://fx.wtf) : il n’a pas les fonctionnalités de jq, mais c’est un visualiseur JSON rapide

    • Si « même un JSON de 16 Mo est très lent », alors aqny est venu ici pour s’amuser et a trouvé du travail. Les problèmes de performance sont les plus amusants à traiter
    • Au travail, je dois manipuler des fichiers JSON de plus de 50 Mo ; ce serait vraiment bien si jnv pouvait gérer ce volume
  • Ça a l’air super. Ce qui m’a toujours frustré avec jq, c’est qu’on ne peut pas voir quelles données on va récupérer avant de l’exécuter

  • Très prometteur. Je vais absolument l’essayer
    Jusqu’ici, j’utilisais jq avec up [0] pour les requêtes interactives, mais l’expérience utilisateur de up ne me plaisait pas vraiment. C’était particulièrement pénible avec les longues requêtes ou les données non ASCII, donc j’aimerais trouver une alternative
    [0]: https://github.com/akavel/up

  • Vraiment bien. Je compte l’installer dès que je remets la main sur mon ordinateur portable
    J’avais déjà créé quelque chose de similaire, donc ce post m’a tout de suite attiré
    https://github.com/bigH/interactively.git
    Je me demande si on ne pourrait pas généraliser davantage cette idée pour ajouter une interface interactive à plus de commandes en CLI. Depuis longtemps, j’imagine un « générateur de commandes » qui ferait apparaître la documentation pertinente selon la position du curseur, et l’afficherait pendant qu’on édite la ligne de commande

  • Très chouette. Je ne sais pas si c’est trop demander, mais je me demande s’il serait possible de l’adapter pour qu’il fonctionne aussi avec OjG, qui utilise JSONPath au lieu de la syntaxe jq. Si cela convient, je serais ravi d’aider

  • Ça a l’air bien. Ça semble assez proche de jless (https://github.com/PaulJuliusMartinez/jless)

    • Il me semble que jless ne permet pas de copier le résultat sous forme de requête jq
  • Ce serait bien que tout le monde connaisse aussi fx comme alternative
    On peut en faire beaucoup plus avec des choses comme map, filter, reduce, et sa sémantique est plus proche de ce qu’on connaît déjà. Il prend aussi en charge YAML
    https://fx.wtf/getting-started

  • En cherchant un outil pour filtrer et afficher dynamiquement des fichiers de logs JSONL, j’ai fini par utiliser VisiData
    Si vous manipulez du JSONL (JSON Lines), je le recommande vivement

  • Je me demandais si ce ne serait pas possible avec seulement fzf

  • Si vous utilisez Sublime Text, il existe aussi un plugin qui permet de faire la même chose [0]
    Pour info, c’est moi qui ai créé ce plugin il y a quelque temps
    [0]: https://packagecontrol.io/packages/Jq