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"
}
AnC
fonte
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"}'.

campovski
fonte
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.

Vita Pluvia
fonte
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));\
 });\
"
Krinkle
fonte
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.

Dave Dopson
fonte
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
locojay
fonte
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))
AnC
fonte
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
gregers
fonte
79

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

Por exemplo:

cat xxx | jq .
Peter Mortensen
fonte
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).

knb
fonte
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 .

Daryl Spitzer
fonte
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

Paul Horsfall
fonte
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.

jordelver
fonte
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.

JedatKinports
fonte
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
Evgeny Karpov
fonte
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.

Johann Philipp Strathausen
fonte
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"
}
JF Sebastian
fonte
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.

yardena
fonte
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'
darscan
fonte
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
Mike Conigliaro
fonte
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
Arpit Rathod
fonte
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
31

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.

npm install jsonlint -g

e depois

jsonlint -p myfile.json

ou

curl -s "http://api.twitter.com/1/users/show/user.json" | jsonlint | less
Salman A
fonte
28

Basta canalizar a saída para jq . .

Exemplo:

twurl -H ads-api.twitter.com '.......' | jq .
Benjamin W.
fonte
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

Shubham Chaudhary
fonte
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

Philip Durbin
fonte
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
htaccess
fonte
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.

Schmitzi
fonte
json_pp estava no meu Mac - mas não o jq. Obrigado!
David H
1
@DavidH - isso ajuda: stackoverflow.com/questions/37668134/…
Schmitzi
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.

pico
fonte
16
  1. brew install jq
  2. command + | jq
  3. (exemplo: curl localhost:5000/blocks | jq :)
  4. Aproveitar!

insira a descrição da imagem aqui

alexanderjsingleton
fonte
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?

Grav
fonte
12

Instale o yajl-tools com o comando abaixo:

sudo apt-get install yajl-tools

então,

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

Uma sankar Pradhan
fonte
Impressionante. Não requer outro idioma / intérprete e está no repositório de pacotes, não há necessidade de preparar!
Joseph Lust