Existe um shell script (Unix) para formatar JSON em formato legível por humanos?
Basicamente, quero transformar o seguinte:
{ "foo": "lorem", "bar": "ipsum" }
... em algo assim:
{
"foo": "lorem",
"bar": "ipsum"
}
Existe um shell script (Unix) para formatar JSON em formato legível por humanos?
Basicamente, quero transformar o seguinte:
{ "foo": "lorem", "bar": "ipsum" }
... em algo assim:
{
"foo": "lorem",
"bar": "ipsum"
}
json
biblioteca do python , mas também adicionei pigmentos para obter o destaque da sintaxe.Respostas:
Com o Python 2.6+, você pode fazer:
ou, se o JSON estiver em um arquivo, você poderá:
se o JSON for de uma fonte da Internet como uma API, você poderá usar
Por conveniência, em todos esses casos, você pode criar um alias:
Para uma conveniência ainda maior, com um pouco mais de digitação para prepará-lo:
para todos os casos acima. Você pode colocar isso
.bashrc
e ele estará disponível todas as vezes no shell. Invoque-o comoprettyjson_s '{"foo": "lorem", "bar": "ipsum"}'
.fonte
pygmentize -l javascript
para obter uma saída colorida de sintaxe em sua linha de comando. Edit : Se você tem pigmentos instalados, é isso.alias pretty='python -mjson.tool | pygmentize -l json
para que eu possa apenas executar:command params | pretty
. Espero que isto ajude. PS: Se alguém conseguir estender isso para: a) remova a saída de onda que estou vendo toda vez e / ou b) NÃO classifique as teclas json; por favor me avise, ficarei muito agradecido.Você pode usar:
jq
É muito simples de usar e funciona muito bem! Ele pode lidar com estruturas JSON muito grandes, incluindo fluxos. Você pode encontrar os tutoriais aqui .
Exemplos de uso:
O . é o filtro de identidade.
fonte
--sort-keys
opção, que é útil em alguns casos.curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfile
.<<<
operador - exatamente o que eu estava procurando.Eu uso o argumento "space"
JSON.stringify
para imprimir JSON em JavaScript.Exemplos:
Na linha de comando do Unix com Node.js, especificando JSON na linha de comandos:
Devoluções:
Na linha de comando do Unix com Node.js, especificando um nome de arquivo que contém JSON e usando um recuo de quatro espaços:
Usando um cano:
fonte
node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"
também envia o resultado para STDOUT.Eu escrevi uma ferramenta que possui um dos melhores formatadores de "espaço em branco inteligente" disponíveis. Produz saída mais legível e menos detalhada do que a maioria das outras opções aqui.
sublinhado-cli
É assim que "espaço em branco inteligente" se parece:
Eu posso ser um pouco tendencioso, mas é uma ferramenta incrível para imprimir e manipular dados JSON a partir da linha de comando. É super amigável de usar e possui extensa ajuda / documentação de linha de comando. É um canivete suíço que eu uso para 1001 pequenas tarefas diferentes que seria surpreendentemente irritante de qualquer outra maneira.
Caso de uso mais recente: Chrome, console do desenvolvedor, guia Rede, exporte tudo como arquivo HAR ", cat site.har | sublinhado, selecione '.url' --outfmt text | grep mydomain"; agora eu tenho uma lista cronologicamente ordenada de todas as buscas de URL feitas durante o carregamento do site da minha empresa.
Impressão bonita é fácil:
Mesma coisa:
A mesma coisa, mais explícita:
Essa ferramenta é o meu projeto atual de paixão; portanto, se você tiver algum pedido de recurso, há uma boa chance de que eu os resolva.
fonte
[32m
,[33m
,[39m
juntamente com alguns não-imprimíveis antes de cada um deles, o que torna JSON não é válido. No entanto, a impressão sublinhada sozinha não adiciona nada a um arquivo e faz seu trabalho de formatação perfeitamente.jq
mas isso funcionou muito bem para o meu "JSON" que não tinha chaves com aspas duplas.Eu costumo fazer:
E para recuperar dados selecionados (neste caso, o valor de "teste"):
Se os dados JSON estiverem em um arquivo:
Se você quiser fazer tudo de uma só vez,
curl
use a linha de comando usando um token de autenticação:fonte
| prettyjson
Graças às dicas muito úteis de JF Sebastian, aqui está um script um pouco aprimorado que eu criei:
fonte
dict
objetos normais não têm uma ordem definida. Tentejson.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False)
e você descobrirá que eles são trocados de qualquer maneira. Para corrigi-lo, importeOrderedDict
eload
passeobject_pairs_hook=OrderedDict
.inputFile = sys.stdin
. Isso permite que você direcione as coisas para o script da seguinte maneira:curl http://somewhere.com/foo.json | pp_json.py
from collections import OrderedDict
.com! FormatJSON %!python -c "from collections import OrderedDict; import sys; import json; j = json.load(sys.stdin, object_pairs_hook=OrderedDict); json.dump(j, sys.stdout, sort_keys=False, indent=4, separators=(',', ': '))"
Observe que os separadores devem ser configurados como (',', ':') para evitar a adição de espaços em branco finais: bugs.python.org/issue16333sort_keys = True
, porque eu quero usar isso para comparar arquivos json e funciona como um encanto.Se você usar o npm e o Node.js, poderá executar e
npm install -g json
canalizar o comandojson
. Façajson -h
para obter todas as opções. Também pode extrair campos específicos e colorir a saída com-i
.fonte
Não é muito simples com uma maneira nativa com as ferramentas jq .
Por exemplo:
fonte
jq . file.json
:; mas tambémcat file.json | jq
(sem o filtro.
) também funciona. (no ubuntu / linux; ymmv em todas as plataformas)Com Perl, use o módulo CPAN
JSON::XS
. Ele instala uma ferramenta de linha de comandojson_xs
.Validar:
Pretifique o arquivo JSON
src.json
parapretty.json
:Se você não tiver
json_xs
, tentejson_pp
. "pp" é para "perl puro" - a ferramenta é implementada apenas no Perl, sem uma ligação a uma biblioteca C externa (que é o que o XS representa, o "Sistema de Extensão" do Perl).fonte
-t null
deu-me nulo: não é um formato válido ... mas deixá-lo funcionou esplendidamente. Obrigado.No * nix, ler de stdin e escrever para stdout funciona melhor:
Coloque isso em um arquivo (eu chamei meu de "prettyJSON" após a resposta do AnC ) em seu PATH
chmod +x
, e você estará pronto .fonte
fileinput.input()
lê de stdin se não houver arquivos fornecidos em uma linha de comando. ExemploO JSON Ruby Gem é fornecido com um script de shell para pretender o JSON:
Download do script: gist.github.com/3738968
fonte
json.tool
. No entanto, também parece ter limitações de profundidade de aninhamento (nesting of 20 is too deep (JSON::NestingError)
).sudo apt-get install ruby-json-pure
vez degem install
prettify_json.rb
?~/bin
pasta (verifique se está no PATH) e renomeá-loprettify_json.rb
parappj
executarchmod +x ppj
. Agora você pode fazer algo parecido comcurl www.jsonsring.com/something.json | ppj
ATUALIZAÇÃO Estou usando
jq
agora, conforme sugerido em outra resposta. É extremamente poderoso na filtragem de JSON, mas, na sua forma mais básica, também é uma maneira incrível de imprimir bastante JSON para visualização.O jsonpp é uma impressora bonita de JSON para linha de comando.
No README:
Se você estiver no Mac OS X, poderá
brew install jsonpp
. Caso contrário, você pode simplesmente copiar o binário para algum lugar no seu$PATH
.fonte
python -mjson.tool
(de outra resposta aqui) e levou 10-20sec ...json_pp
- que faz formato JSON bem, embora, apesar da semelhança na nomenclatura, acredito que este seja um projeto totalmente diferente dojsonpp
aqui mencionadoÉ assim que eu faço:
Reduz o código e realiza o trabalho.
fonte
um script bash simples para uma bonita impressão json
json_pretty.sh
Exemplo:
fonte
%*c
notação, então mudeiprintf
parac=0; while (c++<offset) printf " "; printf $0;
. E o meu awk tem escape de regex diferente e a barra invertida não funciona[]
. Mudei as expressões regulares para/^[[{]/
e/[]}]/
.grep
que foi apagado por engano;)Tente
pjson
. Tem cores!Instale-o com
pip
:⚡ pip install pjson
E então canalize qualquer conteúdo JSON para
pjson
.fonte
NOTA: Não é o caminho para fazê-lo.
O mesmo em Perl:
Nota 2: se você executar
a palavra bem legível se torna \ u codificada
Se o restante do seu pipeline manipular graciosamente o unicode e você desejar que seu JSON também seja amigável ao ser humano, basta usar
ensure_ascii=False
e você terá:
fonte
to_json
parece não aceitar opções. Mas isso funciona:perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
python -m json.tool
.json.tool
exemplos de código. 1. esta versão permite alterar alguns parâmetros, por exemplo,indent
2. Na época do lançamento (2008) Python 2.4 foi usado ainda que não suporta-mjson.tool
Eu uso o jshon para fazer exatamente o que você está descrevendo. Apenas corra:
Você também pode transmitir argumentos para transformar os dados JSON.
fonte
Ou, com Ruby:
fonte
to_json
métodos personalizados ;Kernel#jj
apenas imprime matrizes e hashes bonitos dos mesmos (ou números / seqüências de caracteres / booleanos).echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
Confira Jazor . É um analisador JSON de linha de comando simples, escrito em Ruby.
fonte
curl
e esse é o único que fez isso por mim.Você pode usar este comando simples para alcançar o resultado:
fonte
O JSONLint possui uma implementação de código aberto no GitHub que pode ser usada na linha de comando ou incluída em um projeto Node.js.
e depois
ou
fonte
Basta canalizar a saída para
jq .
.Exemplo:
fonte
cat <file_name.txt> | jq . > <output_name.txt>
brew install jq
se você estiver no Mac OS.jq .
para impressão bonita tem uma desvantagem potencial : todas as versões existentes do jq insistem em tratar os números JSON como números IEEE, para que a precisão seja facilmente perdida, por exemplo, para números inteiros muito grandes.cat file |
é invariavelmente um desperdício de um processo; apenas façajq . <file_name.txt >output_name.txt
(com literal<
e>
caracteres).Pycementize
Combino o json.tool do Python com pycementize:
Existem algumas alternativas para pitonizar, listadas em minha resposta .
Aqui está uma demonstração ao vivo:
fonte
pygmentize -l json
para obter a coloração.python-pygments
, ou sejaapt-get install python-pygments
Com o Perl, se você instalar o JSON :: PP a partir do CPAN, receberá o comando json_pp . Roubando o exemplo de B Bycroft, você obtém:
Vale ressaltar que
json_pp
vem pré-instalado com o Ubuntu 12.04 (pelo menos) e o Debian no/usr/bin/json_pp
fonte
Eu recomendo usar o utilitário de linha de comando json_xs, incluído no módulo JSON :: XS perl. JSON :: XS é um módulo Perl para serializar / desserializar JSON, em uma máquina Debian ou Ubuntu você pode instalá-lo assim:
Obviamente, também está disponível no CPAN .
Para usá-lo para formatar JSON obtido de uma URL, você pode usar curl ou wget assim:
ou isto:
e para formatar o JSON contido em um arquivo, você pode fazer isso:
Para reformatar como YAML , que algumas pessoas consideram mais legível por humanos do que JSON:
fonte
Você pode simplesmente usar ferramentas padrão como jq ou json_pp.
echo '{ "foo": "lorem", "bar": "ipsum" }' | json_pp
ou
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq
ambos pretendem modificar a saída da seguinte forma (jq ainda mais colorido):
A grande vantagem do jq é que ele pode fazer muito mais se você quiser analisar e processar o json.
fonte
jj é super rápido, pode lidar com documentos JSON ginormous economicamente, não mexe com números JSON válidos e é fácil de usar, por exemplo
ou
É (2018) ainda bastante novo, então talvez não lide com JSON inválido da maneira que você espera, mas é fácil de instalar nas principais plataformas.
fonte
brew install jq
command + | jq
curl localhost:5000/blocks | jq
:)fonte
bat
é umcat
clone com destaque de sintaxe:Exemplo:
-p
produzirá sem cabeçalhos e-l
especificará explicitamente o idioma.Possui coloração e formatação para JSON e não apresenta os problemas mencionados neste comentário: Como posso imprimir JSON em um script de shell?
fonte
Instale o yajl-tools com o comando abaixo:
sudo apt-get install yajl-tools
então,
echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat
fonte