O Linux não tem uma maneira integrada de lidar com JSON corretamente, Apesar disto, muitas APIs retornarão saída JSON. A seguir, explica como analisar e usar dados JSON em seus scripts de shell com um utilitário simples.
Analisando JSON com jq
jq
é um utilitário que pode lidar com tudo o que você deseja fazer com JSON. É muito fácil de instalar; basta baixar o binário e movê-lo para sua pasta em seu PATH, geralmente /usr/local/bin/
. Não tem dependências, então é apenas um binário para baixar. Também há downloads para macOS e Windows.
Para iniciar, você pode enviar JSON a ele para imprimi-lo bem. Algumas APIs irão minimizar suas respostas para economizar espaço, o que vai causar essa confusão terrível quando curl
algo no console:
Digite para jq
da mesma forma que:
https curl://api.example.com/ | jq
E agora é legível, com destaque de sintaxe para arrancar:
Se você der jq
um comando, você vai usá-lo para escolher dados fora do JSON, assim como sed
operar com texto. Vamos usar isso JSONPlaceholder como um exemplo de API para testar comandos. Por uma questão de simplicidade, vamos deixar de fora o curl
comando e pipe para manter tudo legível. Além disso, você pode enrolar uma lima e um tubo cat
para jq
, se você não finge ver o curl
saída toda vez que você tentar um novo comando.
Um período simples ‘.
‘Representa os dados canalizados para jq
. Se você apenas deseja obter uma chave do objeto, pode fazer:
jq '.status'
Você também pode aninhar este; como um exemplo, '.data.geo.host'
retornaria um valor mais abaixo na lista. Opcionalmente, você pode adicionar um ponto de interrogação para verificar erros como “.data.geo?.host
“, Que especifica que a propriedade é opcional.
Trabalhar com matrizes é onde jq
fica interessante. Você pode usar colchetes para obter um elemento específico da matriz. Como um exemplo, você pode obter o nome da primeira entrada com:
jq '.[0].nome'
Você pode cortar matrizes usando [2:5]
e use a mesma sintaxe de ponto de interrogação para propriedades opcionais. Mesmo assim, observe que se uma matriz estiver vazia, não significa que seja uma propriedade inválida.
Apesar disto, você provavelmente deseja obter uma entrada específica com base nos dados que ela contém, não em ordem de matriz. Fazer isso, passe toda a matriz para o select
Utilitário:
jq '.[] | selecionar(.nome | contém("Leanne"))'
Isso filtra a matriz para incluir apenas os itens que passam no teste; nesta circunstância, a name
campo contém um nome específico? Pode ser qualquer expressão booleana, incluindo aritmética como select(.count >= 2)
.
Reformatação JSON
jq
você também pode construir JSON, o que significa que você pode usá-lo para reformatar a entrada JSON. Você pode fazer objetos simplesmente envolvendo-os em colchetes e passando jq
declarações como valores. jq
irá gerar o novo objeto. Como um exemplo:
gato json | jq '.[0] | {nome: .nome, empresa: .empresa}'
Saída muito boa para a linha de comando:
Embora isso seja útil para remover apenas as informações que você deseja, você também pode construir novos objetos usando jq
comandos.
Para uma referência completa de todos jq
sintaxe, você pode verifique o seu manual online.
Alternativas a jq
Se você não quiser usar outro programa, você pode usar algumas alternativas. O método mais fácil é desistir de fazer isso no bash e, em seu lugar, usar uma linguagem de script como Python ou JavaScript (com nó) para realizar o processamento real. Em seu lugar, Eu canalizaria a saída do comando JSON para um arquivo:
https curl://api / example.com / > json.txt
E, em seguida, carregue-o em uma variável dentro do script para seu uso.
Você também pode usar utilitários de seleção de texto simples; como um exemplo, se você só precisa de uma chave específica de uma resposta, você pode usar grep junto com um regex para escolher o valor:
grep "nome" | mas 's /"nome": "(.*)"/1/'
Apesar disto, Isso pode (e provavelmente vai acontecer) muito facilmente com qualquer mudança no JSON. Passando na API de usuários, cada nome de usuário foi retornado, mas também o nome de usuário (que também combinou grep), bem como o nome da empresa (que tinha exatamente a mesma chave). A menos que você planeje prestar atenção a tudo isso, você deve usar algo que esteja ciente da estrutura JSON, em vez de tratá-lo como texto.