3 puntos por GN⁺ 2024-03-20 | 1 comentarios | Compartir por WhatsApp
  • jnv es una herramienta creada para explorar JSON que ofrece un visor JSON interactivo junto con un editor de filtros jq
  • Para aplicar filtros usa jaq, por lo que el usuario no necesita preparar jq por separado
  • La entrada admite archivos y stdin, y puede procesar no solo un único JSON, sino también múltiples estructuras JSON como JSON Lines que puedan deserializarse con StreamDeserializer
  • Mediante configuración TOML se pueden ajustar la visualización de hints, la capacidad de respuesta de la UI, el comportamiento del editor, el estilo del visor JSON, la visualización y el comportamiento del autocompletado, y los atajos de teclado
  • El autocompletado solo admite las funciones de jq Identity, Object Identifier-Index y Array Index; en v0.7.0 cambió la sintaxis de configuración TOML, pero no se ofrece una herramienta de migración

Funciones que ofrece jnv

  • jnv es una herramienta interactiva para explorar JSON, que ofrece un visor JSON y un editor de filtros jq
  • Puede aplicar resaltado de sintaxis a JSON
  • Para aplicar filtros jq usa jaq
    • El usuario no necesita preparar jq por su cuenta
  • Está inspirada en jid y jiq

Formatos de entrada y edición de filtros

  • La entrada puede recibirse desde un archivo o desde stdin
  • Los datos pueden ser un único JSON o múltiples estructuras JSON
    • Las múltiples estructuras JSON deben estar en un formato que pueda deserializarse con StreamDeserializer
    • Un ejemplo incluido es JSON Lines
  • El autocompletado de filtros tiene soporte limitado
  • Se pueden mostrar mensajes de hint para ayudar a evaluar filtros

Instalación

  • Se puede instalar con Homebrew
    • brew install jnv
    • O bien brew install ynqa/tap/jnv
  • Se puede instalar con MacPorts
    • sudo port install jnv
  • Se puede usar en Nix / NixOS
    • nix-shell -p jnv
  • Se puede instalar o ejecutar mediante conda-forge
    • pixi global install jnv
    • cat data.json | pixi exec jnv
    • conda install jnv
  • Docker ofrece un ejemplo para compilar y ejecutar la imagen directamente
    • Se indica que la imagen estará disponible en algún registro en un futuro cercano
  • Se puede instalar con Cargo
    • cargo install jnv

Ejemplos de uso y opciones de CLI

  • Se puede ejecutar con un archivo o con entrada estándar
    • cat data.json | jnv
    • jnv data.json
  • En entornos UNIX, al salir se puede escribir el resultado actual en stdout
    • cat data.json | jnv --write-to-stdout | some-command
    • cat data.json | jnv -- --write-to-stdout > result.json
  • El formato básico de uso es jnv [OPTIONS] [INPUT]
  • [INPUT] es una ruta opcional a un archivo JSON
    • Si no se especifica o se indica -, lee desde la entrada estándar
  • Las principales opciones son las siguientes
    • -c, --config <CONFIG_FILE>: especifica la ruta del archivo de configuración
    • --default-filter <DEFAULT_FILTER>: especifica el filtro jq predeterminado que se aplicará a los datos de entrada
    • --write-to-stdout: al salir, imprime el resultado JSON actual en stdout
    • -h, --help: muestra la ayuda
    • -V, --version: muestra la versión

Controles de teclado

  • Los atajos comunes proporcionan acciones básicas en todo el editor y el visor JSON
    • Ctrl + C: salir
    • Ctrl + Q: copiar el filtro jq al portapapeles
    • Ctrl + O: copiar el JSON al portapapeles
    • Shift + ↑, Shift + ↓: cambiar a otro modo
  • Editor mode es el modo predeterminado
    • Tab: ingresar una sugerencia
    • , : mover el cursor a la izquierda o derecha
    • Ctrl + A, Ctrl + E: moverse al inicio y al final de la línea
    • Backspace: borrar el carácter anterior al cursor
    • Ctrl + U: borrar toda la línea
    • Alt + B, Alt + F: moverse a la posición anterior o siguiente tomando como referencia el carácter cercano entre ., |, (, ), [, ]
    • Ctrl + W, Alt + D: borrar hasta la posición anterior o siguiente tomando como referencia el mismo conjunto de caracteres
  • En estado de sugerencias de autocompletado, Tab o selecciona la siguiente sugerencia, y selecciona la anterior
  • JSON viewer mode ofrece navegación por JSON y control de plegado
    • , Ctrl + K: moverse hacia arriba
    • , Ctrl + J: moverse hacia abajo
    • Ctrl + H: moverse al último elemento
    • Ctrl + L: moverse al primer elemento
    • Enter: alternar plegado
    • Ctrl + P: desplegar todo
    • Ctrl + N: plegar todo

Configuración TOML

  • jnv permite personalizar varias funciones mediante un archivo de configuración TOML
  • La prioridad de carga del archivo de configuración es primero la ruta especificada en la línea de comandos con -c o --config, y luego la ruta predeterminada del archivo de configuración
  • La ubicación predeterminada del archivo de configuración varía según la plataforma
    • Linux: ~/.config/jnv/config.toml
    • macOS: ~/Library/Application Support/jnv/config.toml
    • Windows: C:\Users\{Username}\AppData\Roaming\jnv\config.toml
  • Si no existe un archivo de configuración, se crea automáticamente en la primera ejecución
  • En v0.7.0 cambió la sintaxis de configuración TOML, como en default.toml, y los ejemplos reflejan el nuevo formato
    • No se ofrece una herramienta de migración para este cambio
    • El config.toml local debe reemplazarse o actualizarse manualmente para ajustarse a la nueva sintaxis
  • Según el tipo de terminal y el entorno, es posible que los caracteres y estilos no se muestren correctamente
    • Algunos atajos de teclado y caracteres decorativos podrían no mostrarse o no funcionar en ciertos emuladores de terminal

Opciones de configuración ajustables

  • Se puede definir con no_hint si se ocultan o no los mensajes de hint
  • La configuración del editor puede ajustarse separando los estados con foco y sin foco
    • Los modos de entrada usan Insert y Overwrite
    • Se puede especificar una lista de caracteres de límite de palabra para definir el movimiento del cursor y el comportamiento de borrado
    • Se pueden especificar el carácter de prefijo, el estilo del prefijo, el estilo del carácter bajo el cursor y el estilo de los caracteres restantes
  • La configuración de visualización de JSON incluye indentación, estilo de llaves y corchetes, estilos de claves y valores, atributos de la fila seleccionada y manejo de desbordamiento de ancho
    • En entradas de stream, se puede limitar con max_streams la cantidad máxima de objetos JSON a procesar
    • Este valor sirve para reducir el uso de memoria al manejar streams de datos grandes; si no se especifica, no hay límite
  • La configuración de autocompletado ajusta el tamaño de los chunks de resultados de búsqueda y carga en segundo plano
    • Cuanto mayor sea el valor, más rápido podrían mostrarse los resultados o completarse la carga, pero se podría usar más memoria
  • Los atajos de teclado pueden configurarse por acción: salir, copiar consulta, copiar resultado, cambiar de modo, operaciones del editor y operaciones del visor JSON
  • La configuración de capacidad de respuesta de la UI ajusta el retraso de procesamiento de entrada, el retraso de redibujado tras cambiar el tamaño de la ventana y el intervalo de animación del spinner

1 comentarios

 
GN⁺ 2024-03-20
Opiniones de Hacker News
  • Genial. Un pequeño punto en contra es que es muy lento incluso con JSON de tamaño mediano (16 MB), y que los colores de la fuente son demasiado oscuros (envié un PR)
    Mientras buscaba una alternativa con buen rendimiento, vi fx(https://fx.wtf); no tiene las funciones de jq, pero es un visor JSON rápido

    • Si de verdad “un JSON de 16 MB también es muy lento”, entonces aqny vino por curiosidad y terminó encontrando algo que hacer. Abordar problemas de rendimiento es lo más divertido
    • En mi empresa tenemos que manejar archivos JSON de más de 50 MB, así que sería realmente bueno que jnv pudiera procesar ese tamaño
  • Se ve genial. Algo que siempre me frustró de jq es que no puedes ver qué datos vas a obtener hasta ejecutarlo

  • Me genera muchas expectativas. Definitivamente voy a probarlo
    Hasta ahora usaba jq junto con up [0] para consultas interactivas, pero la experiencia de usuario de up no me convencía. En particular, era incómodo con consultas largas o datos no ASCII, así que quiero encontrar una alternativa
    [0]: https://github.com/akavel/up

  • Muy bueno. Pienso instalarlo en cuanto agarre mi laptop
    Hace tiempo hice algo parecido, así que este post me llamó la atención de inmediato
    https://github.com/bigH/interactively.git
    Creo que esta idea podría generalizarse más para agregar una interfaz interactiva a más comandos en la CLI. Desde hace mucho imagino un “constructor de comandos” que, según la posición del cursor, cargue la documentación adecuada y la muestre mientras editas la línea de comandos

  • Muy interesante. No sé si es pedir demasiado, pero me pregunto si se podría adaptar para que funcione también con OjG, que usa JSONPath en vez de la sintaxis de jq. Si les parece bien, con gusto ayudaría

  • Se ve bien. Parece bastante cercano a jless(https://github.com/PaulJuliusMartinez/jless)

    • No parece que jless copie el resultado como una consulta jq
  • Como alternativa, estaría bueno que todos conozcan fx
    Permite hacer mucho más con cosas como map, filter, reduce, y su semántica se acerca más a algo que ya resulta familiar. También soporta YAML
    https://fx.wtf/getting-started

  • Mientras buscaba una herramienta para filtrar y ver dinámicamente archivos de logs JSONL, terminé usando VisiData
    Si manejas JSONL (JSON Lines), lo recomiendo mucho

  • Pensé que esto quizá se podría hacer solo con fzf

  • Si usas Sublime Text, también hay un plugin que permite hacer lo mismo [0]
    De hecho, yo hice ese plugin hace tiempo
    [0]: https://packagecontrol.io/packages/Jq