Processamento de Dados JSON com jq

LinuxBeginner
Pratique Agora

Introdução

Bem-vindo ao Laboratório de Programação Linux jq! Neste laboratório, você descobrirá como usar jq, um processador de JSON de linha de comando leve e versátil. Pense em jq como sed, mas especificamente projetado para dados JSON. Ele permite que você fatie, filtre, mapeie e transforme dados estruturados sem esforço. Este laboratório é estruturado para guiá-lo do uso básico ao avançado de jq por meio de exemplos práticos que você pode aplicar em cenários do mundo real, como processar dados JSON de APIs ou arquivos de configuração.

Imagine que você está planejando uma viagem para a China e usando um aplicativo de viagens que fornece detalhes sobre várias atrações, incluindo suas localizações, horários de funcionamento e avaliações. O backend do aplicativo armazena esses dados em formato JSON. Sua tarefa é extrair informações específicas para planejar sua viagem de forma eficaz. Este laboratório demonstrará como usar jq para consultar e manipular esses dados JSON, permitindo que você identifique rapidamente as atrações perfeitas para visitar.

Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível iniciante com uma taxa de conclusão de 94%. Recebeu uma taxa de avaliações positivas de 99% dos estudantes.

Consultas JSON Básicas

Vamos começar aprendendo como extrair dados simples de um objeto JSON.

Você deve ter agora o arquivo data.txt em seu diretório /home/labex/project/. Ele contém dados JSON representando uma lista de atrações. O conteúdo do arquivo se parece com isto:

[
  {
    "name": "The Great Wall of China",
    "location": "Shanxi Province",
    "opening_hours": "24 hours"
  },
  {
    "name": "Terracotta Warriors",
    "location": "XiAn",
    "opening_hours": "9:00 AM -  5:00 PM"
  }
]

Nosso objetivo aqui é extrair os nomes de todas as atrações listadas nesses dados JSON.

Para conseguir isso, use o seguinte comando:

cat ~/project/data.txt | jq '.[] | .name'

Este comando produzirá a seguinte saída:

"The Great Wall of China"
"Terracotta Warriors"

Vamos detalhar o que está acontecendo neste comando. cat ~/project/data.txt simplesmente lê o conteúdo do arquivo data.txt. O símbolo |, conhecido como pipe, pega a saída do comando cat e a alimenta como entrada para o comando jq. O núcleo da lógica de extração está em jq '.[] | .name'. Veja como jq processa isso:

  • .[] diz ao jq para iterar por cada elemento (neste caso, cada objeto de atração) no array JSON.
  • |, novamente, canaliza o resultado da iteração para a próxima operação, neste caso .name.
  • .name extrai o valor associado à chave "name" de cada um dos objetos de atração.

Em essência, o comando percorre cada atração, seleciona seu nome e o exibe.

Filtrando Dados JSON

Vamos passar para a filtragem de dados JSON com base em critérios específicos.

Nosso objetivo é encontrar apenas aquelas atrações que estão abertas 24 horas.

Use o seguinte comando para realizar isso:

cat ~/project/data.txt | jq '.[] | select(.opening_hours == "24 hours") | .name'

A execução deste comando produzirá a seguinte saída:

"The Great Wall of China"

Veja como a filtragem funciona: O comando começa com cat ~/project/data.txt | jq '.[]', que, como antes, lê o arquivo e itera sobre cada atração. A parte chave é a adição de select(.opening_hours == "24 hours"):

  • select() é uma função jq que permite filtrar elementos do JSON com base em uma condição que você especifica.
  • A condição .opening_hours == "24 hours" verifica se o valor do campo opening_hours é exatamente igual à string "24 hours". Apenas as atrações que corresponderem a esta condição serão passadas para a próxima etapa.
  • A parte final, | .name, simplesmente extrai o nome de cada atração que passou no filtro.

Neste caso, apenas "The Great Wall of China" atende à condição, então é o único nome que é extraído e exibido.

Transformando Dados JSON

Agora, vamos explorar como transformar dados JSON em um formato diferente, mais útil.

Nosso objetivo aqui é tornar os horários de funcionamento mais legíveis. Especificamente, se uma atração estiver aberta 24 horas, queremos exibir "Aberto 24 horas"; caso contrário, adicionaremos o prefixo "Aberto " ao texto existente do horário de funcionamento.

Use o seguinte comando para conseguir isso:

cat ~/project/data.txt | jq '.[] | {name: .name, location: .location, opening_hours: (.opening_hours | if . == "24 hours" then "Open 24 hours" else "Open \(.)" end)}'

Este comando produz a seguinte saída:

{
  "name": "The Great Wall of China",
  "location": "Shanxi Province",
  "opening_hours": "Open 24 hours"
}
{
  "name": "Terracotta Warriors",
  "location": "XiAn",
  "opening_hours": "Open 9:00 AM -  5:00 PM"
}

Vamos entender a transformação: Como antes, cat ~/project/data.txt | jq '.[]' nos dá o pontapé inicial lendo o arquivo e iterando por cada atração no array. O núcleo desta transformação está na construção do objeto e na instrução if-else:

  • {name: .name, location: .location, opening_hours: ...} cria um novo objeto JSON, puxando dados do objeto original. Ele inclui o name e location do objeto original diretamente. O valor para o campo opening_hours, no entanto, é mais complexo.
  • (.opening_hours | if . == "24 hours" then "Open 24 hours" else "Open \(.)" end) pega o valor do opening_hours original e o processa:
    • .opening_hours seleciona o valor original do horário de funcionamento.
    • A instrução if . == "24 hours" then "Open 24 hours" else "Open \(.)" end verifica se o opening_hours original é exatamente igual a "24 hours". Se for, o valor é substituído por "Open 24 hours". Caso contrário, "Open " é adicionado como um prefixo ao opening_hours existente. Observe o uso de \(.), que nos permite incorporar o valor dentro da string.

Em essência, este comando transforma os dados criando um novo objeto para cada atração e ajustando o valor de opening_hours para ser mais legível para o usuário.

Resumo

Parabéns! Você concluiu com sucesso o Laboratório de Programação Linux jq. Você aprendeu como consultar, filtrar e transformar dados JSON usando jq, uma ferramenta poderosa para trabalhar com dados estruturados diretamente da linha de comando. Seja processando dados de APIs, arquivos de configuração ou qualquer outra fonte JSON, jq permite que você extraia, filtre e manipule os dados de que precisa com grande eficiência e clareza.

Lembre-se, a prática consistente é essencial para dominar jq e outras ferramentas de linha de comando. Sinta-se à vontade para experimentar com seus próprios dados JSON, testando diferentes consultas e transformações. Boa codificação!