3 pontos por GN⁺ 2024-03-20 | 1 comentários | Compartilhar no WhatsApp
  • jnv é uma ferramenta criada para explorar JSON, oferecendo juntos um visualizador JSON interativo e um editor de filtros jq
  • A aplicação dos filtros usa jaq, então o usuário não precisa preparar o jq separadamente
  • A entrada aceita arquivos e stdin, e pode processar não só um JSON único, mas também várias estruturas JSON, como JSON Lines, desde que possam ser desserializadas com StreamDeserializer
  • Com configuração em TOML, é possível ajustar a exibição de dicas, a responsividade da UI, o comportamento do editor, o estilo do visualizador JSON, a exibição e o comportamento do autocompletar e os atalhos de teclado
  • O autocompletar oferece suporte apenas a recursos do jq como Identity, Object Identifier-Index e Array Index, e na v0.7.0 a sintaxe de configuração TOML mudou, mas não foi fornecida nenhuma ferramenta de migração

Recursos oferecidos pelo jnv

  • jnv é uma ferramenta interativa para explorar JSON e oferece um visualizador JSON e um editor de filtros jq
  • É possível aplicar realce de sintaxe ao JSON
  • A aplicação de filtros jq usa jaq
    • O usuário não precisa preparar o jq manualmente
  • Inspirado em jid e jiq

Formatos de entrada e edição de filtros

  • A entrada pode vir de arquivo ou stdin
  • Os dados podem ser um JSON único ou várias estruturas JSON
  • O autocompletar de filtros tem suporte limitado
  • É possível exibir mensagens de dica para ajudar na avaliação dos filtros

Como instalar

  • Pode ser instalado com Homebrew
    • brew install jnv
    • ou brew install ynqa/tap/jnv
  • Pode ser instalado com MacPorts
    • sudo port install jnv
  • Pode ser usado em Nix / NixOS
    • nix-shell -p jnv
  • Pode ser instalado ou executado pelo caminho do conda-forge
    • pixi global install jnv
    • cat data.json | pixi exec jnv
    • conda install jnv
  • Para Docker, há um exemplo de como compilar e executar a imagem manualmente
    • O texto informa que a imagem deverá ser disponibilizada em algum registro em um futuro próximo
  • Pode ser instalado com Cargo
    • cargo install jnv

Exemplos de uso e opções de CLI

  • Pode ser executado com arquivo ou entrada padrão
    • cat data.json | jnv
    • jnv data.json
  • Em ambientes UNIX, ao sair é possível escrever o resultado atual no stdout
    • cat data.json | jnv --write-to-stdout | some-command
    • cat data.json | jnv -- --write-to-stdout > result.json
  • O formato básico de uso é jnv [OPTIONS] [INPUT]
  • [INPUT] é um caminho opcional para arquivo JSON
    • Se não for informado, ou se - for informado, a leitura será feita da entrada padrão
  • As principais opções são as seguintes
    • -c, --config <CONFIG_FILE>: especifica o caminho do arquivo de configuração
    • --default-filter <DEFAULT_FILTER>: especifica o filtro jq padrão a ser aplicado aos dados de entrada
    • --write-to-stdout: imprime o resultado JSON atual no stdout ao sair
    • -h, --help: exibe a ajuda
    • -V, --version: exibe a versão

Atalhos de teclado

  • Os atalhos comuns fornecem o comportamento padrão no editor e no visualizador JSON
    • Ctrl + C: sair
    • Ctrl + Q: copiar o filtro jq para a área de transferência
    • Ctrl + O: copiar o JSON para a área de transferência
    • Shift + ↑, Shift + ↓: alternar para outro modo
  • O Editor mode é o modo padrão
    • Tab: inserir sugestão
    • , : mover o cursor para a esquerda ou direita
    • Ctrl + A, Ctrl + E: ir para o início e o fim da linha
    • Backspace: apagar o caractere antes do cursor
    • Ctrl + U: apagar a linha inteira
    • Alt + B, Alt + F: mover para a posição anterior ou seguinte com base no caractere mais próximo entre ., |, (, ), [, ]
    • Ctrl + W, Alt + D: apagar até a posição anterior ou seguinte com base no mesmo conjunto de caracteres
  • Quando as sugestões de autocompletar estão ativas, Tab ou seleciona a próxima sugestão, e seleciona a sugestão anterior
  • O JSON viewer mode oferece navegação no JSON e controle de recolhimento
    • , Ctrl + K: mover para cima
    • , Ctrl + J: mover para baixo
    • Ctrl + H: ir para o último item
    • Ctrl + L: ir para o primeiro item
    • Enter: alternar recolhimento
    • Ctrl + P: expandir tudo
    • Ctrl + N: recolher tudo

Configuração TOML

  • O jnv permite personalizar vários recursos com um arquivo de configuração TOML
  • A prioridade de carregamento do arquivo de configuração é primeiro o caminho especificado na linha de comando com -c ou --config, e depois o caminho padrão do arquivo de configuração
  • A localização padrão do arquivo de configuração varia por plataforma
    • Linux: ~/.config/jnv/config.toml
    • macOS: ~/Library/Application Support/jnv/config.toml
    • Windows: C:\Users\{Username}\AppData\Roaming\jnv\config.toml
  • Se o arquivo de configuração não existir, ele será criado automaticamente na primeira execução
  • Na v0.7.0, a sintaxe de configuração TOML como em default.toml mudou, e os exemplos refletem o novo formato
    • Não foi fornecida nenhuma ferramenta de migração para essa mudança
    • O config.toml local deve ser substituído ou atualizado manualmente para o novo formato
  • Dependendo do tipo de terminal e do ambiente, alguns caracteres e estilos podem não ser exibidos corretamente
    • Alguns atalhos e caracteres decorativos podem não aparecer ou não funcionar em certos emuladores de terminal

Itens de configuração ajustáveis

  • É possível definir com no_hint se as mensagens de dica devem ser ocultadas
  • As configurações do editor podem ser ajustadas separando estado com foco e sem foco
    • Os modos de entrada usam Insert e Overwrite
    • É possível definir a lista de caracteres de fronteira de palavra para controlar o movimento do cursor e as ações de exclusão
    • É possível definir o caractere de prefixo, o estilo do prefixo, o estilo do caractere sob o cursor e o estilo dos demais caracteres
  • As configurações de exibição JSON incluem recuo, estilo de colchetes, estilo de chaves e valores, atributos da linha selecionada e forma de tratar largura excedida
    • Em entradas em stream, é possível limitar com max_streams o número máximo de objetos JSON a processar
    • Esse valor serve para reduzir o uso de memória ao lidar com grandes streams de dados e, se não for definido, não há limite
  • As configurações de autocompletar ajustam os resultados de busca e o tamanho dos blocos de carregamento em segundo plano
    • Quanto maior o valor, mais rápida pode ser a exibição dos resultados ou a conclusão do carregamento, mas com maior uso de memória
  • Os atalhos de teclado podem ser configurados para sair, copiar consulta, copiar resultado, trocar de modo, operar o editor e operar o visualizador JSON
  • As configurações de responsividade da UI ajustam o atraso no processamento de entrada, o atraso para redesenhar após redimensionar a janela e o intervalo da animação do spinner

1 comentários

 
GN⁺ 2024-03-20
Comentários do Hacker News
  • Legal. Uma pequena ressalva é que ele é muito lento até com JSON de tamanho médio (16 MB), e as cores da fonte são escuras demais (enviei um PR)
    Procurando alternativas com bom desempenho, vi o fx (https://fx.wtf); ele não tem os recursos do jq, mas é um visualizador de JSON rápido

    • Se “JSON de 16 MB também é muito lento” for verdade, então o aqny veio aqui por diversão e acabou encontrando trabalho para fazer. Lidar com problemas de desempenho é a parte mais divertida
    • No trabalho, preciso lidar com arquivos JSON de 50 MB ou mais, então seria muito bom se o jnv conseguisse processar esse tamanho
  • Parece bacana. O que sempre me frustrava no jq era que eu não conseguia ver quais dados eu obteria antes de executar

  • Estou bem animado. Com certeza vou conferir
    Até agora, eu usava jq junto com up [0] para consultas interativas, mas não gostava muito da experiência de usuário do up. Especialmente com consultas longas ou dados não ASCII, era incômodo, então quero encontrar uma alternativa
    [0]: https://github.com/akavel/up

  • Muito bom. Assim que eu pegar meu notebook, vou instalar
    Já fiz algo parecido antes, então este post me chamou a atenção imediatamente
    https://github.com/bigH/interactively.git
    Fico pensando se não daria para generalizar mais essa ideia e adicionar interfaces interativas a mais comandos na CLI. Há muito tempo imagino um “construtor de comandos” que traga a documentação adequada de acordo com a posição do cursor e a mostre enquanto a linha de comando é editada

  • Muito legal. Não sei se é pedir demais, mas fico curioso se seria possível adaptá-lo para funcionar também com o OjG, que usa JSONPath em vez da sintaxe do jq. Se for aceitável, eu teria prazer em ajudar

  • Parece bom. Parece bem próximo do jless (https://github.com/PaulJuliusMartinez/jless)

    • Acho que o jless não copia o resultado como uma consulta jq
  • Como alternativa, seria bom que todos conhecessem também o fx
    Dá para fazer muito mais coisas como map, filter, reduce, e a semântica também é mais próxima do que já é familiar. Também oferece suporte a YAML
    https://fx.wtf/getting-started

  • Enquanto procurava uma ferramenta para filtrar e visualizar dinamicamente arquivos de log JSONL, acabei usando o VisiData
    Se você trabalha com JSONL (JSON Lines), recomendo muito

  • Pensei que talvez isso fosse possível só com fzf

  • Se você usa Sublime Text, também há um plugin que faz a mesma coisa [0]
    Aliás, eu fiz esse plugin há algum tempo
    [0]: https://packagecontrol.io/packages/Jq