Processamento de JSON com jq: Técnicas de Parsing, Filtragem e Formatação

Visão Geral

jq é uma ferramenta de linha de comando leve, projetada para manipular dados JSON. Ela permite analisar, filtrar, transformar e formatar JSON diretamente no termnial, facilitando o trabalho com dados estruturados em scripts e workflows de desenvolvimento.

Instalação

Para sistemas baseados em Debian, como Ubuntu, a instalação pode ser feita via gerenciador de pacotes:

apt install jq

Sintaxe e Uso Básico

A estrutura de comando do jq segue o padrão:

jq [opções] <filtro> [arquivo...]</filtro>

Opções essenciais incluem:

  • -r: exibe a saída como string crua, removendo aspas do JSON.
  • -c: gera saída compacta em uma única linha.
  • -s: agrupa múltiplas entradas em um array para processamento.
  • --arg: injeta variáveis externas no filtro.

O jq aceita dados de arquivos locais ou via redirecionamento padrão, como a saída de comandos curl.

Formatação de JSON

Para embelezar a saída JSON de uma string simples:

echo '{"cidade":"São Paulo","populacao":12300000}' | jq .

Extração de Campos

É possível extrair valores específicos de objetos JSON:

# Obter um único campo
echo '{"cidade":"São Paulo","populacao":12300000}' | jq '.cidade'

# Acessar campos aninhados
echo '{"local":{"cidade":"São Paulo"}}' | jq '.local.cidade'

# Extrair múltiplos campos simultaneamente
echo '{"cidade":"São Paulo","populacao":12300000}' | jq '.cidade, .populacao'

Trabalhando com Arrays

O jq oferece operações robustas para manipulação de arrays:

# Iterar sobre todos os elementos
echo '[5,10,15]' | jq '.[]'

# Acessar elemento por índice
echo '[5,10,15]' | jq '.[0]'

# Realizar fatiamento
echo '[5,10,15,20,25]' | jq '.[1:3]'  # Resultado: [10,15]

Filtros Essenciais

Encadeamento com Pipe

Use o operador de pipe para encadear múltiplas operações:

echo '[{"nome":"Lucas"},{"nome":"Maria"}]' | jq '.[] | .nome'

Operações Aritméticas

O jq suporta cálculos matemáticos diretamente:

echo '{"valor1":8,"valor2":12}' | jq '.valor1 + .valor2'

Manipulação de Strings

Funções integradas permitem transformar strings:

echo '{"texto":"exemplo"}' | jq '.texto | ascii_upcase'  # Converte para maiúsculas
echo '{"texto":"EXEMPLO"}' | jq '.texto | ascii_downcase'  # Converte para minúsculas
echo '{"texto":"exemplo"}' | jq '.texto | length'   # Calcula o comprimento

Recursos Avançados

Condições e Lógica

Incorpore estruturas condicionais nos filtros:

echo '{"idade":30}' | jq 'if .idade >= 18 then "maior" else "menor" end'

Mapeamento de Arrays

Transforme cada elemento de um array usando map:

echo '[2,4,6]' | jq 'map(. * 5)'

Filtragem com Select

Selecione elementos com base em critérios específicos:

echo '[{"pontos":85},{"pontos":72}]' | jq '.[] | select(.pontos >= 80)'

Uso de Variáveis

Passe parâmetros externos para os filtros:

jq --arg usuario "Carlos" '.nome = $usuario' config.json

Exemplos Práticos

Formatando Saída de API

Execute uma requisição HTTP e formate o JSON retornado:

curl -s https://api.example.com/dados | jq

Extração Compelxa de Dados

Dado o arquivo registros.json com conteúdo:

{

  "equipes": [

    {"membro": "Ana", "experiencia": 5},

    {"membro": "Pedro", "experiencia": 2}

  ]

}

Para listar membros com mais de 3 anos de experiência:

jq '.equipes[] | select(.experiencia > 3) | .membro' registros.json

Geração de JSON com Cálculos

Crie um novo objeto JSON a partir de operações matemáticas:

echo '{"a":7,"b":3}' | jq '{produto: (.a * .b)}'

# Saída: {"produto": 21}

Tags: jq JSON command-line data filtering Terminal

Publicado em 7-9 20:55