Como posso imprimir JSON em um script de shell?


3061

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"
}


7
Revirei o meu por um tempo: github.com/exhuma/braindump/tree/master/jsonformat O código é muito simples, usando a própria jsonbiblioteca do python , mas também adicionei pigmentos para obter o destaque da sintaxe.
— Exhuma

Tropecei sobre isso, mas depois encontrei Json Pretty e eu gosto bastante. Typekit utiliza-lo em seus exemplos de API, por isso há alguns klout por trás dele ^^
— Nick Tomlin

Se você não se importa em copiar colas, também existem algumas ferramentas simples online, como jsonprettyprint.net, nas quais é possível imprimir rapidamente seu JSON bruto.
— #

7
Esteja avisado: python -m json.tool nem sempre produz JSON válido. (Dica: 1e1000)
— peak

Respostas:


4461

Com o Python 2.6+, você pode fazer:

echo '{"foo": "lorem", "bar": "ipsum"}' | python -m json.tool

ou, se o JSON estiver em um arquivo, você poderá:

python -m json.tool my_json.json

se o JSON for de uma fonte da Internet como uma API, você poderá usar

curl http://my_url/ | python -m json.tool

Por conveniência, em todos esses casos, você pode criar um alias:

alias prettyjson='python -m json.tool'

Para uma conveniência ainda maior, com um pouco mais de digitação para prepará-lo:

prettyjson_s() {
    echo "$1" | python -m json.tool
}

prettyjson_f() {
    python -m json.tool "$1"
}

prettyjson_w() {
    curl "$1" | python -m json.tool
}

para todos os casos acima. Você pode colocar isso .bashrce ele estará disponível todas as vezes no shell. Invoque-o como prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'.


73
Você pode canalizar isso pygmentize -l javascriptpara obter uma saída colorida de sintaxe em sua linha de comando. Edit : Se você tem pigmentos instalados, é isso.
— Shrikant Sharat

177
Uma ótima resposta, apenas cautela que tenho com ela é que ela classifica as chaves na saída - das quais você precisa estar ciente.
— Chris Nash

14
Em myy .vimrc "nnoremap <f5>:%! Python -m json.tool <CR>: w <CR>"
— imwilsonxu

40
Isso parece escapar caracteres Unicode para \ uXXXX, o que pode ser uma desvantagem.
— user1071136

14
Eu criei um alias: alias pretty='python -mjson.tool | pygmentize -l jsonpara 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.
— Clint Eastwood

1023

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:

$ jq --color-output . file1.json file1.json | less -R

$ command_with_json_output | jq .

$ jq . # stdin/"interactive" mode, just enter some JSON

$ jq . <<< '{ "foo": "lorem", "bar": "ipsum" }'
{
  "bar": "ipsum",
  "foo": "lorem"
}

O . é o filtro de identidade.


11
Há também uma --sort-keysopção, que é útil em alguns casos.
— Matthew Flaschen

9
Trabalhando com curl:curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
— Passe o mouse em Ruan

19
"jq." é excelente como uma impressora bonita, mas vem com uma ressalva: jq (incluindo a versão 1.5 da jq 1.5) alterará os valores de números muito grandes e muito pequenos porque analisa valores numéricos como valores de 64 bits da IEEE 754. Para verificar se sua impressora bonita favorita tem o mesmo problema, tente este valor: 1e1000. Observe que python -mjson.tool falha muito nesse teste, pois produz Infinity, que nem é JSON.
— pico

1
Como uma nota, você pode redirecionar o resultado formatado para um arquivo: echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfile.
— Chad

26
@Eekohi a alternativa é "uso desnecessário de eco". Super feliz por ter encontrado o <<<operador - exatamente o que eu estava procurando.
— jchook

381

Eu uso o argumento "space" JSON.stringifypara imprimir JSON em JavaScript.

Exemplos:

// Indent with 4 spaces
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, 4);

// Indent with tabs
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, '\t');

Na linha de comando do Unix com Node.js, especificando JSON na linha de comandos:

$ node -e "console.log(JSON.stringify(JSON.parse(process.argv[1]), null, '\t'));" \
  '{"foo":"lorem","bar":"ipsum"}'

Devoluções:

{
    "foo": "lorem",
    "bar": "ipsum"
}

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:

$ node -e "console.log(JSON.stringify(JSON.parse(require('fs') \
      .readFileSync(process.argv[1])), null, 4));"  filename.json

Usando um cano:

echo '{"foo": "lorem", "bar": "ipsum"}' | node -e \
"\
 s=process.openStdin();\
 d=[];\
 s.on('data',function(c){\
   d.push(c);\
 });\
 s.on('end',function(){\
   console.log(JSON.stringify(JSON.parse(d.join('')),null,2));\
 });\
"

10
Para objetos de depuração no Node.js., você realmente deve usar sys.inspect () em vez de JSON.stringify (). Eis o porquê: markhansen.co.nz/inspecting-with-json-stringify
— Gurpartap Singh

11
Votado. O OP é sobre um "script de linha de comando nix" e esta resposta é um contexto diferente.
— Danorton 02/09/12

49
@danorton: JS pode ser usado na linha de comando via node.js e outras soluções semelhantes.
— calvinf

10
Não há necessidade do console: node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"também envia o resultado para STDOUT.
— Julian D.

2
É chato que o script é diferente para um nome de arquivo vs. stdin
— Lukasz Wiktor

340

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:

underscore -i data.json print

Mesma coisa:

cat data.json | underscore print

A mesma coisa, mais explícita:

cat data.json | underscore print --outfmt pretty

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.


4
Também atualizei meu ~ / .bash_profile para ter a seguinte linha: alias underscor = 'underscore print --outfmt pretty' agora eu posso fazer curl example.com/result.json | sublinhado e ainda usar sublinhado para outra formatação
— Gal Bracha

Graças à Dave! Ferramenta é boa! aliás bem-json = "underrsore bonita" e saída de onda agradar um olho
— Maxim Ponomarev

Ótima ferramenta de formatação, apenas uma nota: o encaminhamento da saída para um arquivo (com a opção -o ou com > ) funciona apenas com impressão sublinhada . sublinhado muito salva um arquivo com sinais de formatação de cores a ser inserido, smth como: [32m, [33m, [39mjuntamente 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.
— tiurin

Eu amo, jqmas isso funcionou muito bem para o meu "JSON" que não tinha chaves com aspas duplas.
— Bluu

@DaveDopson obrigado pela ótima ferramenta !! Vou tentar usá-lo ao lado jsonselect.org/#tryit ...
— mycargus

173

Eu costumo fazer:

echo '{"test":1,"test2":2}' | python -mjson.tool

E para recuperar dados selecionados (neste caso, o valor de "teste"):

echo '{"test":1,"test2":2}' | python -c 'import sys,json;data=json.loads(sys.stdin.read()); print data["test"]'

Se os dados JSON estiverem em um arquivo:

python -mjson.tool filename.json

Se você quiser fazer tudo de uma só vez, curluse a linha de comando usando um token de autenticação:

curl -X GET -H "Authorization: Token wef4fwef54te4t5teerdfgghrtgdg53" http://testsite/api/ | python -mjson.tool

se o json deve vir diretamente do http api, esta também é uma boa ferramenta implementada em python: github.com/jkbr/httpie #
— Florian

Se você tem nó instalado (e não se importa a saída estilo YAML) há também neste pacote: rafeca.com/prettyjson assim você pode acabar com uma onda com | prettyjson
— Iolo

3
Como observado acima, um dos problemas com o python -mjson.tool como uma bonita impressora JSON é que ele nem sempre emite JSON. Por exemplo, 1e1000 torna-se Infinito (seja usando python 2.x ou 3.x). 'jq.' sempre produz JSON, mas não garante que valores muito grandes (ou muito pequenos) sejam preservados exatamente.
— pico

88

Graças às dicas muito úteis de JF Sebastian, aqui está um script um pouco aprimorado que eu criei:

#!/usr/bin/python

"""
Convert JSON data to human-readable form.

Usage:
  prettyJSON.py inputFile [outputFile]
"""

import sys
import simplejson as json


def main(args):
    try:
        if args[1] == '-':
            inputFile = sys.stdin
        else:
            inputFile = open(args[1])
        input = json.load(inputFile)
        inputFile.close()
    except IndexError:
        usage()
        return False
    if len(args) < 3:
        print json.dumps(input, sort_keys = False, indent = 4)
    else:
        outputFile = open(args[2], "w")
        json.dump(input, outputFile, sort_keys = False, indent = 4)
        outputFile.close()
    return True


def usage():
    print __doc__


if __name__ == "__main__":
    sys.exit(not main(sys.argv))

3
Quando os valores são carregados no dicionário, a ordem é perdida: dictobjetos normais não têm uma ordem definida. Tente json.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False)e você descobrirá que eles são trocados de qualquer maneira. Para corrigi-lo, importe OrderedDicte loadpasse object_pairs_hook=OrderedDict.
— Icktoofay

Você pode alterar o script para ler da entrada padrão com este: 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
— Gabe Johnson

1
E para evitar a classificação com @ OrderedDict importação como este icktoofay do comentário,: from collections import OrderedDict.
— Hugo

2
Obrigado @icktoofay. Isso me permitiu criar a seguinte função vim: 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/issue16333
— blindsnowmobile

Ótimo trecho! Eu usei sort_keys = True, porque eu quero usar isso para comparar arquivos json e funciona como um encanto.
— JL Peyret

81

Se você usar o npm e o Node.js, poderá executar e npm install -g jsoncanalizar o comando json. Faça json -hpara obter todas as opções. Também pode extrair campos específicos e colorir a saída com -i.

curl -s http://search.twitter.com/search.json?q=node.js | json

79

Não é muito simples com uma maneira nativa com as ferramentas jq .

Por exemplo:

cat xxx | jq .

7
AVISO: jq codifica números como flutuadores IEEE 754 de 64 bits e, portanto, é provável que sua representação mude. A precisão de números muito pequenos e muito grandes provavelmente será perdida. Para verificar se sua impressora bonita favorita tem o mesmo problema, tente este valor: 1e1000.
— pico

5
ou simplesmente jq . file.json:; mas também cat file.json | jq(sem o filtro .) também funciona. (no ubuntu / linux; ymmv em todas as plataformas)
— michael

73

Com Perl, use o módulo CPAN JSON::XS. Ele instala uma ferramenta de linha de comando json_xs.

Validar:

json_xs -t null < myfile.json

Pretifique o arquivo JSON src.jsonpara pretty.json:

< src.json json_xs > pretty.json

Se você não tiver json_xs, tente json_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).


9
Parece vir de fábrica com o Cygwin!
— Janus Troelsen

12
O json_pp pode ser usado da mesma maneira e provavelmente está prontamente instalado no seu sistema (no Debian está no pacote 'perl').
— perfil completo de MichielB

8
Para sua informação, no meu sistema Mac OS X 10.9, o json_pp está disponível automaticamente.
— Gregg Williams

-t nulldeu-me nulo: não é um formato válido ... mas deixá-lo funcionou esplendidamente. Obrigado.
— Lucas

pp é para perl puro, não é uma boa impressão aqui :) Como o json_xs e o json_pp podem fazer mais do que apenas o pretty print e também com -json_opt, fazem outras coisas em vez de uma boa impressão. Embora a impressão bonita seja o comportamento padrão.
— precisa

70

No * nix, ler de stdin e escrever para stdout funciona melhor:

#!/usr/bin/env python
"""
Convert JSON data to human-readable form.

(Reads from stdin and writes to stdout)
"""

import sys
try:
    import simplejson as json
except:
    import json

print json.dumps(json.loads(sys.stdin.read()), indent=4)
sys.exit(0)

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 .


De fato, usar stdin / stdout é muito mais flexível e simples. Obrigado por apontar isso.
— AnC

3
Para programas que esperam um arquivo nomeado, use / dev / stdin, idem para out e err.
— dvogel

4
A EFY fileinput.input()lê de stdin se não houver arquivos fornecidos em uma linha de comando. Exemplo
— jfs

fileinput.input () não pode lidar bem com arquivos sem nova linha no final, da última vez que verifiquei.
— Zachary Vance

ele pergunta no shell script, não em python em outra linguagem. Com JQ pode fazê-lo perfeitamente.
— Bui Anh Tuan

65

O JSON Ruby Gem é fornecido com um script de shell para pretender o JSON:

sudo gem install json
echo '{ "foo": "bar" }' | prettify_json.rb

Download do script: gist.github.com/3738968


6
Observe que esta solução decodifica as seqüências de escape unicode "\ uxxxx", diferente da Python json.tool. No entanto, também parece ter limitações de profundidade de aninhamento ( nesting of 20 is too deep (JSON::NestingError)).
— A3nm

2
no Ubuntu você pode fazer: em sudo apt-get install ruby-json-purevez degem install
— Janus Troelsen 27/03

1
`` eric-mbp: ~ ericstob $ sudo gem install json Senha: Buscando: json-1.7.3.gem (100%) Criando extensões nativas. Isso pode demorar um pouco ... Instalado com êxito o json-1.7.3 1 gem instalado Instalando a documentação do ri para o json-1.7.3 ... Instalando a documentação do RDoc para o json-1.7.3 ... eric-mbp: ~ ericstob $ prettify_json .rb -bash: prettify_json.rb: comando não encontrado
— Eric Hartford

talvez você possa postar o conteúdo do seu prettify_json.rb?
— Andrew

Você pode fazer o download do script, movê-lo para sua ~/binpasta (verifique se está no PATH) e renomeá-lo prettify_json.rbpara ppjexecutar chmod +x ppj. Agora você pode fazer algo parecido comcurl www.jsonsring.com/something.json | ppj
— Uri

58

ATUALIZAÇÃO Estou usando jqagora, 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:

Respostas de serviços da Web de impressão bonitas, assim:

curl -s -L http://<!---->t.co/tYTq5Pu | jsonpp

e embeleze os arquivos que circulam no seu disco:

jsonpp data/long_malformed.json

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.


1
Eu tentei o jsonpp (usado no passado com sucesso) contra um arquivo enorme (> 60MB). Eu parei depois de 5min. I canalizada-lo em python -mjson.tool(de outra resposta aqui) e levou 10-20sec ...
— Volker

60MB de JSON? Uau! Normalmente, não lido com arquivos tão grandes, mas úteis para saber. Obrigado.
— Jordelver 28/04

No meu Ubuntu caixa Eu tenho um json_pp- que faz formato JSON bem, embora, apesar da semelhança na nomenclatura, acredito que este seja um projeto totalmente diferente do jsonppaqui mencionado
— davidpricedev

56

É assim que eu faço:

curl yourUri | json_pp

Reduz o código e realiza o trabalho.


3
Servidor Ubuntu: se você tiver máquinas de produção com instalações muito restritas, essa pode ser a melhor opção, pois ela é instalada por padrão com um nome específico. O Python geralmente é instalado de maneiras diferentes (por exemplo, python3, python ou não), dependendo da versão.
— jonathanjo

55

um script bash simples para uma bonita impressão json

json_pretty.sh

#/bin/bash

grep -Eo '"[^"]*" *(: *([0-9]*|"[^"]*")[^{}\["]*|,)?|[^"\]\[\}\{]*|\{|\},?|\[|\],?|[0-9 ]*,?' | awk '{if ($0 ~ /^[}\]]/ ) offset-=4; printf "%*c%s\n", offset, " ", $0; if ($0 ~ /^[{\[]/) offset+=4}'

Exemplo:

cat file.json | json_pretty.sh

1
Obrigado pelo feedback. Acabei de escrever este script hoje para uso pessoal e funcionou bem nos meus casos. Fiz correções, agora é menor e sem esse problema. Não há um objetivo de oferecer suporte completo ao formato, mas posso fazer outras correções, se necessário.
— Evgeny Karpov

2
Essa é a única resposta que encontrei. Eu tenho um linux incorporado - sem rubby, sem javascript, sem acesso à Internet para baixar módulos python ... Tenho um awk ligeiramente diferente que não suporta %*cnotação, então mudei printfpara c=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 /[]}]/.
— Zaboj Campula 06/10

2
Esta deve ser a aceitaram, como ele é cheio nativo e não requerem software de terceiros ...
— Blag

1
@EvgenyKarpov prendedor agradável, há necessidade de uma reversão completa, apenas o grepque foi apagado por engano;)
— Blag

1
Obrigado cara, eu queria uma maneira rápida de formatar um json de uma linha de 8 MB, em simples e simples bash.
— Ahmed M

53

Tente pjson. Tem cores!

eco '{"json": "obj"} |  pjson

Instale-o com pip:

⚡ pip install pjson

E então canalize qualquer conteúdo JSON para pjson.


Requer python-pip (sudo apt-get install python-pip) e depois (sudo pip install pjson) A grande vantagem são as cores!
— Kristjan Adojaan

1
A desvantagem é que não é possível grep saída colorida.
— Kristjan Adojaan

51
$ echo '{ "foo": "lorem", "bar": "ipsum" }' \
> | python -c'import fileinput, json;
> print(json.dumps(json.loads("".join(fileinput.input())),
>                  sort_keys=True, indent=4))'
{
    "bar": "ipsum",
    "foo": "lorem"
}

NOTA: Não é o caminho para fazê-lo.

O mesmo em Perl:

$ cat json.txt \
> | perl -0007 -MJSON -nE'say to_json(from_json($_, {allow_nonref=>1}), 
>                                     {pretty=>1})'
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

Nota 2: se você executar

echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
| python -c'import fileinput, json;
print(json.dumps(json.loads("".join(fileinput.input())),
                 sort_keys=True, indent=4))'

a palavra bem legível se torna \ u codificada

{
    "D\u00fcsseldorf": "lorem", 
    "bar": "ipsum"
}

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

echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
| python -c'import fileinput, json;
print json.dumps(json.loads("".join(fileinput.input())),
                 sort_keys=True, indent=4, ensure_ascii=False)'

e você terá:

{
    "Düsseldorf": "lorem", 
    "bar": "ipsum"
}

na verdade eu fazer o mesmo, mas com o próprio javascript :)
— Robert Gould

2
Na versão do módulo JSON que tenho, to_jsonparece não aceitar opções. Mas isso funciona:perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
— Rörd

O exemplo do Python pode ser simplificado. É muito mais fácil canalizar diretamente a saída JSON python -m json.tool.
— Dan Loewenherz 17/03/2014

@ Dan: sim. E há várias respostas que mostram json.toolexemplos de código. 1. esta versão permite alterar alguns parâmetros, por exemplo, indent2. Na época do lançamento (2008) Python 2.4 foi usado ainda que não suporta-mjson.tool
— jfs

40

Eu uso o jshon para fazer exatamente o que você está descrevendo. Apenas corra:

echo $COMPACTED_JSON_TEXT | jshon

Você também pode transmitir argumentos para transformar os dados JSON.


Obrigado, jshon é muito mais rápido do que usar Python ou Ruby para a mesma tarefa
— Alexander

2
@Alexander - Qual a velocidade de uma impressora bonita que você precisa? Estou no OSx Lion que vem com o Python pré-instalado. Com python -mjson.tool, posso imprimir um arquivo json de 96 KB em 0.1s - a saída json do earthporn ao qual o jshon se vincula é de cerca de 24 KB e posso imprimir isso em 0.08s. Quanto mais rápido o jshon é para você?
— Jönsson

1
Estou trabalhando com arquivos de dados JSON compactados de 1 + GB (que sabem até o tamanho descompactado), por isso aprecio muito a sugestão de que o jshon é mais rápido.
— Ryan Ballantyne

38

Ou, com Ruby:

echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'

Isso me dá um erro. Você precisa de algum pacote ruby ​​json instalado?
— Mj6

3
Sim, é necessário o JSON de Ruby Gem: sudo gem install json
— darscan

@MatSchaffer Observe que isso não funcionará se você estiver usando JSON para serializar objetos com to_jsonmétodos personalizados ; Kernel#jjapenas imprime matrizes e hashes bonitos dos mesmos (ou números / seqüências de caracteres / booleanos).
— Phrogz

No Windows, tente o seguinte: echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
— Ross Attrill

36

Confira Jazor . É um analisador JSON de linha de comando simples, escrito em Ruby.

gem install jazor
jazor --help

4
Sou eu ou essa é a única sugestão que realmente responde à pergunta do OP? Eu vim aqui procurando um comando simples no qual eu pudesse canalizar a saída curle esse é o único que fez isso por mim.
— Leo Cassarani

2
Eu gosto que ele tem a opção de colorir a saída. Faz com que seja mais fácil de ler.
— Andrew

ooh Eu também gosto da opção de passar uma url desde que eu estou usando isso para ver a saída do meu API REST
— Andrew

35

Você pode usar este comando simples para alcançar o resultado:

echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool

Melhor resposta na minha opinião. Pequeno e fácil de lembrar e não requer a instalação de ferramentas não padrão.
— Eugene C

python -m json.tool não parece preservar a ordem do objeto JSON.
— pushNpop


28

Basta canalizar a saída para jq . .

Exemplo:

twurl -H ads-api.twitter.com '.......' | jq .

Boa resposta ao @Ackshaey Singh e também é possível redirecionar o mesmo para um arquivo com facilidade. Exemplocat <file_name.txt> | jq . > <output_name.txt>
— Pramit 07/10

9
brew install jqse você estiver no Mac OS.
— Distwo

1
Infelizmente, o uso 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.
— pico

2
@Pramit cat file |é invariavelmente um desperdício de um processo; apenas faça jq . <file_name.txt >output_name.txt(com literal <e >caracteres).
— Mark Reed

24

Pycementize

Combino o json.tool do Python com pycementize:

echo '{"foo": "bar"}' | python -m json.tool | pygmentize -g

Existem algumas alternativas para pitonizar, listadas em minha resposta .

Aqui está uma demonstração ao vivo:

Demo


5
Às vezes é preciso usar pygmentize -l jsonpara obter a coloração.
— JP

Instale com o pacote apt python-pygments, ou sejaapt-get install python-pygments
— janeiro

23

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:

[pdurbin@beamish ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

Vale ressaltar que json_ppvem pré-instalado com o Ubuntu 12.04 (pelo menos) e o Debian no/usr/bin/json_pp


19

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:

sudo apt-get install libjson-xs-perl

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:

$ curl -s http://page.that.serves.json.com/json/ | json_xs

ou isto:

$ wget -q -O - http://page.that.serves.json.com/json/ | json_xs

e para formatar o JSON contido em um arquivo, você pode fazer isso:

$ json_xs < file-full-of.json

Para reformatar como YAML , que algumas pessoas consideram mais legível por humanos do que JSON:

$ json_xs -t yaml < file-full-of.json

19

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):

{
  "foo": "lorem",
  "bar": "ipsum"
}

A grande vantagem do jq é que ele pode fazer muito mais se você quiser analisar e processar o json.


json_pp estava no meu Mac - mas não o jq. Obrigado!
— David H


obrigado! Nunca tinha ouvido falar de jq antes.
— David H

17

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

jj -p # for reading from STDIN

ou

jj -p -i input.json

É (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.



16

bat é um cat clone com destaque de sintaxe:

Exemplo:

echo '{"bignum":1e1000}' | bat -p -l json

-pproduzirá sem cabeçalhos e -lespecificará 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?


12

Instale o yajl-tools com o comando abaixo:

sudo apt-get install yajl-tools

então,

echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat


Impressionante. Não requer outro idioma / intérprete e está no repositório de pacotes, não há necessidade de preparar!
— Joseph Lust
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.