read Como posso imprimir JSON em um script de shell?



json terminal (20)

Existe um script shell (Unix) para formatar JSON em forma legível?

Basicamente, quero transformar o seguinte:

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

... em algo como isto:

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

https://src-bin.com


Answer #1

Bash de baunilha

Um simples script Bash ( grep / awk ) para impressão JSON, sem instalação de terceiros:

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

Exemplos:

1) Leia arquivo e impressão bonita no console

cat file.json | json_pretty.sh

2) Use com o Bash GIT do Windows de arquivo para arquivo (baseado em UTF8):

cat fileIn.json |sh.exe json_pretty.sh > fileOut.json

Answer #2

Pygngize

Eu combino o json.tool do Python com pygentize:

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

Existem algumas alternativas para pygmentize que estão listadas na minha resposta .

Aqui está uma demonstração ao vivo:


Answer #3

É assim que eu faço:

gem install jazor
jazor --help

Ele encurta o código e faz o trabalho.


Answer #4

A versão do PHP, se você tiver PHP> = 5.4.

alias prettify_json=php -E '$o = json_decode($argn); print json_encode($o, JSON_PRETTY_PRINT);'
echo '{"a":1,"b":2}' | prettify_json

Answer #5

Com o 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

Prettify o arquivo JSON src.json para pretty.json :

< src.json json_xs > pretty.json

Se você não tem json_xs , tente json_pp . "pp" é para "perl puro" - a ferramenta é implementada apenas em Perl, sem uma ligação a uma biblioteca C externa (que é o que significa XS, "Sistema de Extensão" da Perl).


Answer #6

Com o Python 2.6+, você pode apenas fazer:

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

ou, se o JSON estiver em um arquivo, você pode fazer:

python -m json.tool my_json.json

Se o JSON é de uma fonte da Internet, como uma API, você pode 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 ainda mais comodidade 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 no .bashrc e ele estará disponível toda vez no shell. Invoque-o como prettyjson_s '{"foo": "lorem", "bar": "ipsum"}' .


Answer #7

Estou usando httpie

$ pip install httpie

E você pode usá-lo assim

 $ http PUT localhost:8001/api/v1/ports/my 
 HTTP/1.1 200 OK
 Connection: keep-alive
 Content-Length: 93
 Content-Type: application/json
 Date: Fri, 06 Mar 2015 02:46:41 GMT
 Server: nginx/1.4.6 (Ubuntu)
 X-Powered-By: HHVM/3.5.1

 {
     "data": [], 
     "message": "Failed to manage ports in 'my'. Request body is empty", 
     "success": false
 }

Answer #8

Eu costumo apenas 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 vez com curl na linha de comando usando um token de autenticação:

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

Answer #9

Eu recomendo usar o utilitário de linha de comando json_xs que está incluído no módulo perl JSON :: XS. 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

Está obviamente também disponível no CPAN .

Para usá-lo para formatar o JSON obtido de um 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 do que JSON:

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

Answer #10

Eu uso 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.


Answer #11

Graças aos ponteiros muito úteis de JF Sebastian, aqui está um script ligeiramente melhorado 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))

Answer #12

Instale o yajl-tools com o comando abaixo:

sudo apt-get install yajl-tools

então,

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


Answer #13

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 nomeei o meu "prettyJSON" após a resposta do AnC ) no seu PATH e chmod +x , e você está AnC para ir.


Answer #14

O JSON Ruby Gem é empacotado com um script de shell para enfeitar o JSON:

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

Download de script: gist.github.com/3738968


Answer #15

Se você usar o npm e o Node.js, você pode fazer o npm install -g json e depois canalizar o comando através do json . Faça json -h para 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

Answer #16

Simplesmente canalize a saída para jq . .

Exemplo:

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

Answer #17

Você pode usar: jq

É muito simples de usar e funciona muito bem! Ele pode manipular estruturas JSON muito grandes, incluindo fluxos. Você pode encontrar seus tutoriais here .

Aqui está um exemplo:

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

Ou em outras palavras:

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

Answer #18

JSONLint tem 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

Answer #19

jj é super-rápido, pode lidar com documentos JSON enormes economicamente, não mexer 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 ele não lide com o JSON inválido da maneira esperada, mas é fácil de instalar nas principais plataformas.


Answer #20

ATUALIZAÇÃO Estou usando o jq agora como sugerido em outra resposta. É extremamente poderoso para filtrar o JSON, mas, na sua forma mais básica, também é uma ótima maneira de imprimir JSON para a visualização.

jsonpp é uma bela linha de comando JSON pretty printer.

Do README:

Respostas de serviços da Web de impressão bonita como:

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

e deixe os arquivos bonitos no seu disco:

jsonpp data/long_malformed.json

Se você está no Mac OS X, você pode brew install jsonpp . Se não, você pode simplesmente copiar o binário para algum lugar no seu $PATH .





pretty-print