Come posso stampare graziosamente JSON in uno script di shell?


3061

Esiste uno script di shell (Unix) per formattare JSON in forma leggibile dall'uomo?

Fondamentalmente, voglio che trasformi quanto segue:

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

... in qualcosa del genere:

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


7
Ho fatto il mio giro poco tempo fa: github.com/exhuma/braindump/tree/master/jsonformat Il codice è molto semplice, usando la jsonlibreria di python , ma ho aggiunto anche i pigmenti per ottenere l'evidenziazione della sintassi.
exhuma,

Ci siamo imbattuti in questo, ma poi ho trovato Json Pretty e mi piace molto. Typekit lo usa nei loro esempi API, quindi c'è un po 'di klout dietro di esso ^^
Nick Tomlin,

Se non ti dispiace copiare e incollare, ci sono anche alcuni semplici strumenti online come jsonprettyprint.net in cui puoi stampare velocemente e velocemente il tuo JSON grezzo.
Javaaaa,

7
Attenzione: python -m json.tool non produce sempre JSON valido. (Suggerimento: 1e1000)
picco

Risposte:


4462

Con Python 2.6+ puoi semplicemente fare:

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

oppure, se JSON si trova in un file, è possibile eseguire:

python -m json.tool my_json.json

se JSON proviene da una fonte Internet come un'API, è possibile utilizzare

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

Per comodità in tutti questi casi puoi creare un alias:

alias prettyjson='python -m json.tool'

Per una comodità ancora maggiore con un po 'più di digitazione per prepararlo:

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

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

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

per tutti i casi di cui sopra. Puoi inserirlo .bashrce sarà disponibile ogni volta nella shell. Invocalo come prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'.


73
È possibile reindirizzarlo su pygmentize -l javascriptper ottenere l'output colorato della sintassi nella riga di comando. Modifica : se hai installato i pigmenti.
Shrikant Sharat,

177
Una grande risposta, in guardia solo che ho con essa è fa specie i tasti sulla produzione - che potrebbe essere necessario essere a conoscenza.
Chris Nash,

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

40
Questo sembra sfuggire ai caratteri Unicode in \ uXXXX, il che potrebbe essere uno svantaggio.
user1071136,

14
Ho creato un alias: alias pretty='python -mjson.tool | pygmentize -l jsonin modo che io posso solo correre: command params | pretty. Spero che sia di aiuto. PS: Qualcuno dovrebbe riuscire ad estenderlo a a) rimuovere l'output arricciato che vedo ogni volta eb / NON b) NON ordinare le chiavi json; per favore fatemi sapere, sarò molto grato.
Clint Eastwood,

1023

Puoi usare: jq

È molto semplice da usare e funziona benissimo! Può gestire strutture JSON molto grandi, inclusi i flussi. Puoi trovare i loro tutorial qui .

Esempi di utilizzo:

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

Il . è il filtro identità.


11
C'è anche --sort-keysun'opzione, che è utile in alcuni casi.
Matthew Flaschen,

9
Lavorare con l'arricciatura:curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
Passa il mouse su Ruan il

19
"jq." è fantastico come una bella stampante, ma viene fornito con un avvertimento: jq (fino alla versione 1.5 inclusa jq) modificherà i valori di numeri molto grandi e molto piccoli perché analizza i valori numerici come IEEE 754 valori a 64 bit. Per verificare se la tua stampante preferita ha lo stesso problema, prova questo valore: 1e1000. Si noti che python -mjson.tool fallisce gravemente questo test in quanto produce Infinity, che non è nemmeno JSON.
picco

1
Come una nota, è possibile reindirizzare il risultato formattato in un file: echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfile.
Chad,

26
@Meekohi l'alternativa è "l'uso non necessario dell'eco". Super felice di aver trovato l' <<<operatore - esattamente quello che stavo cercando.
jchook,

381

Uso l'argomento "spazio" JSON.stringifyper stampare graziosamente JSON in JavaScript.

Esempi:

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

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

Dalla riga di comando Unix con Node.js, specificando JSON sulla riga di comando:

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

Ritorna:

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

Dalla riga di comando Unix con Node.js, specificando un nome file che contiene JSON e usando un rientro di quattro spazi:

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

Usando una pipa:

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
Per il debug degli oggetti in Node.js, dovresti davvero usare sys.inspect () invece di JSON.stringify (). Ecco perché: markhansen.co.nz/inspecting-with-json-stringify
Gurpartap Singh

11
Downvoted. L'OP riguarda uno "script da riga di comando * nix" e questa risposta è un contesto diverso.
danorton,

49
@danorton: JS può essere utilizzato dalla riga di comando tramite node.js e altre soluzioni simili.
calvinf,

10
Non è necessaria la console: node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"trasmette anche il risultato a STDOUT.
Julian D.

2
Fa schifo che lo script sia diverso per un nome di file vs. stdin
Lukasz Wiktor,

340

Ho scritto uno strumento che ha uno dei migliori formattatori di "spazi bianchi intelligenti" disponibili. Produce un output più leggibile e meno dettagliato rispetto alla maggior parte delle altre opzioni qui.

sottolineatura-cli

Ecco come appare lo "spazio bianco intelligente":

Potrei essere un po 'di parte, ma è uno strumento fantastico per stampare e manipolare i dati JSON dalla riga di comando. È super-facile da usare e ha una vasta guida / documentazione da riga di comando. È un coltellino svizzero che uso per 1001 diversi piccoli compiti che sarebbero sorprendentemente fastidiosi di fare diversamente.

Caso d'uso più recente: Chrome, console di sviluppo, scheda Rete, esporta tutto come file HAR, "cat site.har | carattere di sottolineatura seleziona '.url' --outfmt text | grep mydomain"; ora ho un elenco ordinato cronologicamente di tutti i recuperi di URL effettuati durante il caricamento del sito della mia azienda.

La stampa graziosa è facile:

underscore -i data.json print

Stessa cosa:

cat data.json | underscore print

Stessa cosa, più esplicita:

cat data.json | underscore print --outfmt pretty

Questo strumento è il mio attuale progetto di passione, quindi se hai delle richieste di funzionalità, ci sono buone probabilità che le indirizzerò.


4
Ho anche aggiornato il mio ~ / .bash_profile per avere la seguente riga: alias underscor = 'underscore print --outfmt pretty' ora posso solo fare curl esempio.com/result.json | sottolineare e usare ancora il trattino basso per altre formattazioni
Gal Bracha,

Grazie Dave! Lo strumento è buono! alias pretty-json = "underrsore pretty" e curl output piacevoli da vedere
Maxim Ponomarev,

Ottimo strumento di formattazione, solo una nota: l'inoltro dell'output a un file (con l' opzione -o o con > ) funziona solo con la sottolineatura di stampa . sottolineatura piuttosto salva un file con colore segni di formattazione di essere inseriti, come si dovrebbe occupare: [32m, [33m, [39minsieme ad alcuni non stampabile prima di ognuno di loro, il che rende JSON non è valida. Tuttavia, la sottolineatura di stampa da sola non aggiunge nulla a un file e fa perfettamente il suo lavoro di formattazione.
tiurin

Adoro jqma questo ha funzionato benissimo per il mio "JSON" che non aveva le doppie chiavi tra virgolette.
Bluu,

@DaveDopson grazie per l'ottimo strumento !! Proverò ad usarlo insieme a jsonselect.org/#tryit ...
mycargus

173

Di solito faccio solo:

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

E per recuperare i dati selezionati (in questo caso, il valore "test"):

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

Se i dati JSON sono in un file:

python -mjson.tool filename.json

Se vuoi fare tutto in una volta con curlsulla riga di comando usando un token di autenticazione:

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

se il json dovrebbe provenire direttamente da un http api, questo è anche uno strumento piacevole implementato in python: github.com/jkbr/httpie
Florian,

Se hai un nodo installato (e non ti preoccupare dell'output in stile YAML) c'è anche questo pacchetto: rafeca.com/prettyjson in modo da poter terminare un ricciolo con | prettyjson
Iolo

3
Come notato sopra, uno dei problemi con python -mjson.tool come una bella stampante JSON è che non sempre emette JSON. Ad esempio 1e1000 diventa Infinity (se si utilizza python 2.xo 3.x). "jq." produce sempre JSON, ma non garantisce che valori molto grandi (o molto piccoli) vengano conservati esattamente.
picco

88

Grazie ai consigli molto utili di JF Sebastian, ecco uno script leggermente migliorato che ho ideato:

#!/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 i valori vengono caricati nel dizionario, l'ordine viene perso: gli dictoggetti normali non hanno un ordine definito. Prova json.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False)e scoprirai che sono comunque scambiati. Per risolvere il problema, importare OrderedDicte loadpassare object_pairs_hook=OrderedDict.
icktoofay

È possibile modificare lo script per leggere da standard input con questo: inputFile = sys.stdin. Questo ti permette di reindirizzare la sceneggiatura in questo modo:curl http://somewhere.com/foo.json | pp_json.py
Gabe Johnson,

1
E per evitare di smistamento con @ icktoofay di commento, OrderedDict importazione in questo modo: from collections import OrderedDict.
Hugo,

2
Grazie @icktoofay. Questo mi ha permesso di creare la seguente funzione 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=(',', ': '))" Notare che i separatori devono essere impostati come (',', ':') per evitare di aggiungere spazi bianchi finali: bugs.python.org/issue16333
blindsnowmobile

Grande frammento! Ho usato sort_keys = Trueinvece, perché voglio usare questo per confrontare i file JSON e funziona come un fascino.
JL Peyret,

81

Se si utilizza npm e Node.js, è possibile eseguire npm install -g jsone reindirizzare il comando json. Fai json -hper avere tutte le opzioni. Può anche estrarre campi specifici e colorare l'output con -i.

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

79

Non è troppo semplice con un modo nativo con gli strumenti jq .

Per esempio:

cat xxx | jq .

7
ATTENZIONE: jq codifica i numeri come float IEEE 754 a 64 bit, quindi è probabile che la loro rappresentazione cambi. È probabile che si perda la precisione di numeri molto piccoli e molto grandi. Per verificare se la tua stampante preferita ha lo stesso problema, prova questo valore: 1e1000.
picco

5
o semplicemente jq . file.json:; ma funziona anche cat file.json | jq(senza filtro .). (su Ubuntu / Linux; ymmv su piattaforme diverse)
michael

73

Con Perl, utilizzare il modulo CPAN JSON::XS. Installa uno strumento da riga di comando json_xs.

Convalidare:

json_xs -t null < myfile.json

Prettify il file JSON src.jsonper pretty.json:

< src.json json_xs > pretty.json

Se non lo hai json_xs, prova json_pp. "pp" sta per "puro perl" - lo strumento è implementato solo in Perl, senza un legame con una libreria C esterna (che è ciò che XS sta per "Sistema di estensione" di Perl).


9
Sembra standard con Cygwin!
Janus Troelsen,

13
json_pp può essere usato allo stesso modo ed è molto probabilmente installato sul tuo sistema (su Debian è nel pacchetto 'perl').
MichielB,

8
Cordiali saluti, sul mio sistema Mac OS X 10.9, json_pp è disponibile automaticamente.
Gregg Williams,

-t nullmi ha dato null: non un valido toformat ... ma lasciarlo spento ha funzionato magnificamente. Grazie.
Lucas

la pp è per puro perl, non abbastanza stampa qui :) Dal momento che json_xs e json_pp possono fare molto di più della semplice stampa e anche con -json_opt fare altre cose invece di stampare piuttosto. Sebbene la stampa carina sia il comportamento predefinito.
Kjetil S.

70

Su * nix, leggere da stdin e scrivere su stdout funziona meglio:

#!/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)

Metti questo in un file (ho chiamato il mio "prettyJSON" dopo la risposta di AnC ) nel tuo PERCORSO ed chmod +xesso, e sei a posto.


In effetti, l'uso di stdin / stdout è molto più flessibile e semplice. Grazie per segnalarlo.
AnC

3
Per i programmi che prevedono un file denominato, utilizzare / dev / stdin, idem per out ed err.
dvogel,

4
FYI fileinput.input()legge da stdin se non ci sono file dati da una riga di comando. Esempio
jfs,

fileinput.input () non riesce a gestire bene i file senza newline alla fine, l'ultima volta che ho controllato.
Zachary Vance,

chiede in shell script, non in altre lingue pitone. Con JQ puoi farlo perfettamente.
Bui Anh Tuan,

65

JSON Ruby Gem è fornito in bundle con uno script shell per preimpostare JSON:

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

Download dello script: gist.github.com/3738968


6
Nota che questa soluzione decodifica le sequenze di escape unicode "\ uxxxx", diversamente da quella con Python json.tool. Tuttavia, sembra anche avere limiti di profondità di annidamento ( nesting of 20 is too deep (JSON::NestingError)).
a3nm,

2
su Ubuntu puoi fare: sudo apt-get install ruby-json-pureinvece digem install
Janus Troelsen il

1
`` `eric-mbp: ~ ericstob $ sudo gem install json Password: recupero: json-1.7.3.gem (100%) Creazione di estensioni native. Questo potrebbe richiedere del tempo ... Installazione corretta json-1.7.3 1 gemma installata Installazione della documentazione ri per json-1.7.3 ... Installazione della documentazione RDoc per json-1.7.3 ... eric-mbp: ~ ericstob $ prettify_json .rb -bash: prettify_json.rb: comando non trovato
Eric Hartford

potresti pubblicare i tuoi contenuti prettify_json.rb?
Andrew,

È possibile scaricare lo script, spostarlo alla ~/bincartella (assicurarsi che sia nel tuo PATH) Rinominare prettify_json.rba ppjed eseguire chmod +x ppj. Ora puoi fare qualcosa del generecurl www.jsonsring.com/something.json | ppj
Uri,

58

AGGIORNAMENTO Sto usando jqora come suggerito in un'altra risposta. È estremamente potente nel filtrare JSON, ma, nella sua forma più semplice, è anche un modo fantastico per stampare JSON per la visualizzazione.

jsonpp è una bella stampante JSON da riga di comando molto carina.

Dal README:

Le risposte dei servizi Web piuttosto stampate in questo modo:

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

e rendi belli i file che girano sul tuo disco:

jsonpp data/long_malformed.json

Se sei su Mac OS X, puoi farlo brew install jsonpp. In caso contrario, puoi semplicemente copiare il file binario in un punto qualsiasi del tuo $PATH.


1
Ho provato jsonpp (usato in passato con successo) contro un file enorme (> 60 MB). L'ho fermato dopo 5 minuti. L'ho convogliato in python -mjson.tool(da un'altra risposta qui) e ci sono voluti 10-20 secondi ...
volker

60 MB di JSON? Wow! Di solito non mi occupo di file così grandi ma utili da sapere. Grazie.
jordelver,

Sul mio Ubuntu box ho un json_pp- che formatta bene JSON, anche se nonostante la somiglianza nella denominazione, credo che questo sia un progetto completamente diverso da quello jsonppmenzionato qui
davidpricedev

56

Ecco come lo faccio:

curl yourUri | json_pp

Riduce il codice e porta a termine il lavoro.


3
Server Ubuntu: se hai macchine di produzione con installazioni molto limitate, questa potrebbe essere la scelta migliore in quanto è installata di default con un nome specifico. Python è spesso installato in diversi modi (ad es. Python3, python o per niente) a seconda della versione.
jonathanjo,

55

un semplice script bash per la stampa piuttosto 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}'

Esempio:

cat file.json | json_pretty.sh

1
Grazie per il feedback. Ho appena scritto questo script oggi per uso personale e ha funzionato bene nei miei casi. Ho fatto delle correzioni, ora è più piccolo e senza questo problema. Non esiste un obiettivo per supportare la formattazione completa, ma posso apportare altre correzioni se necessario.
Evgeny Karpov,

2
Questa è solo una risposta funzionante che ho trovato. Ho un Linux embedded - non rubby, javascript, non ha accesso a Internet per scaricare moduli Python ... Ho awk leggermente diverso che non supporta %*cla notazione così ho cambiato la printfa c=0; while (c++<offset) printf " "; printf $0;. E il mio awk ha diversi regex in escape e la barra rovesciata non funziona []. Ho cambiato le regex in /^[[{]/e /[]}]/.
Zaboj Campula,

2
Questo dovrebbe essere accettato, poiché è nativo completo e non richiede software di terze parti ...
Blag

1
@EvgenyKarpov bella cattura, non c'è bisogno di un rollback completo, solo quello grepche è stato cancellato per errore;)
Blag

1
Grazie amico, volevo un modo rapido per formattare un json da 1 MB da 8 MB, in semplice bash.
Ahmed M

53

Prova pjson. Ha dei colori!

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

Installalo con pip:

⚡ pip install pjson

E quindi reindirizzare qualsiasi contenuto JSON a pjson.


Richiede python-pip (sudo apt-get install python-pip) e quindi (sudo pip install pjson) Il grande vantaggio sono i colori!
Kristjan Adojaan,

1
Lo svantaggio è che non è possibile grep output colorato.
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: non è il modo di farlo.

Lo stesso in 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 corri

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

la parola ben leggibile diventa \ u codificata

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

Se il resto della tua pipeline gestirà con grazia unicode e desideri che anche il tuo JSON sia a misura d'uomo, utilizza semplicemente 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 otterrai:

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

in realtà faccio lo stesso ma con lo stesso javascript :)
Robert Gould,

2
Nella versione del modulo JSON che ho, to_jsonnon sembra accettare le opzioni. Ma funziona:perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
Rörd,

L'esempio di Python potrebbe essere semplificato. È molto più semplice reindirizzare l'output JSON direttamente python -m json.tool.
Dan Loewenherz,

@ Dan: si. E ci sono diverse risposte che mostrano json.toolesempi di codice. 1. questa versione consente di modificare alcuni parametri, ad es. indent2. Al momento della pubblicazione (2008) era ancora usato Python 2.4 che non supporta-mjson.tool
jfs

40

Uso jshon per fare esattamente quello che stai descrivendo. Corri:

echo $COMPACTED_JSON_TEXT | jshon

È inoltre possibile passare argomenti per trasformare i dati JSON.


Grazie, jshon è molto più veloce rispetto all'utilizzo di pitone o rubino per lo stesso compito
Alexander

2
@Alexander - Quanto velocemente hai bisogno di una bella stampante? Sono su OSx Lion fornito con Python preinstallato. Con python -mjson.tool posso piuttosto stampare un file json da 96 KB in 0,1 secondi - l'output json di earthporn a cui jshon collega è di circa 24 KB e posso piuttosto stamparlo in 0,08 secondi. Quanto è più veloce jshon per te?
joensson,

1
Sto lavorando con 1 + GB di dati compressi JSON (che sa anche quanto non compressi), quindi apprezzo molto il suggerimento che jshon sia più veloce.
Ryan Ballantyne,

38

Oppure, con Ruby:

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

Questo mi dà un errore. Ti serve un pacchetto ruby ​​json installato?
mjs

3
Sì, è necessario il JSON Ruby Gem: sudo gem install json
darscan

@MatSchaffer Si noti che questo non funziona se si utilizza JSON per serializzare oggetti con to_jsonmetodi personalizzati ; Kernel#jjstampa solo array e hash uguali (o numeri / stringhe / booleani).
Phrogz,

Su Windows, prova questo: echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
Ross Attrill

36

Dai un'occhiata a Jazor . È un semplice parser JSON da riga di comando scritto in Ruby.

gem install jazor
jazor --help

4
Sono solo io o è l'unico suggerimento che risponde effettivamente alla domanda del PO? Sono venuto qui alla ricerca di un semplice comando in cui avrei potuto convogliare l'output di curle questo è l'unico che l'ha fatto per me.
Leo Cassarani,

2
Mi piace che abbia l'opzione per colorare l'output. Rendilo più facile da leggere.
Andrew,

ooh Mi piace anche l'opzione per passare un URL dal momento che sto usando questo per visualizzare l'output della mia API REST
Andrew

35

È possibile utilizzare questo semplice comando per ottenere il risultato:

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

La migliore risposta secondo me. Piccolo e facile da ricordare e non richiede l'installazione di strumenti non standard.
Eugene C

python -m json.tool non sembra preservare l'ordine dell'oggetto JSON.
pushNpop


28

Semplicemente reindirizza l'output a jq ..

Esempio:

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

Bella risposta @Ackshaey Singh e si può reindirizzare facilmente lo stesso su un file. ad es.cat <file_name.txt> | jq . > <output_name.txt>
Pramit

9
brew install jqse sei su mac os.
Distwo

1
Sfortunatamente, l'utilizzo jq .per pretty-printing ha un potenziale svantaggio: tutte le versioni esistenti di jq insistono nel trattare i numeri JSON come numeri IEEE, quindi la precisione si perde facilmente, ad esempio per numeri interi molto grandi.
picco

2
@Pramit cat file |è invariabilmente uno spreco di processo; fai jq . <file_name.txt >output_name.txt(con letterali <e >personaggi).
Mark Reed,

24

Con Perl, se installi JSON :: PP da CPAN otterrai il comando json_pp . Rubando l' esempio da B Bycroft ottieni:

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

Vale la pena ricordare che json_ppviene preinstallato con Ubuntu 12.04 (almeno) e Debian in/usr/bin/json_pp


24

pygmentize

Combino json.tool di Python con pygmentize:

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

Ci sono alcune alternative a pygmentize che sono elencate nella mia risposta .

Ecco una demo live:

dimostrazione


5
A volte è necessario utilizzare pygmentize -l jsonper ottenere la colorazione.
JP

Installare con il pacchetto apt python-pygments, vale a direapt-get install python-pygments
Gennaio

19

Consiglio di utilizzare l'utilità della riga di comando json_xs inclusa nel modulo perl JSON :: XS. JSON :: XS è un modulo Perl per serializzare / deserializzare JSON, su una macchina Debian o Ubuntu puoi installarlo in questo modo:

sudo apt-get install libjson-xs-perl

È ovviamente disponibile anche su CPAN .

Per usarlo per formattare JSON ottenuto da un URL puoi usare curl o wget in questo modo:

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

o questo:

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

e per formattare JSON contenuto in un file puoi fare questo:

$ json_xs < file-full-of.json

Per riformattare come YAML , che alcune persone considerano più leggibile umanamente di JSON:

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

19

Puoi semplicemente usare strumenti standard come jq o json_pp.

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

o

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

prettificheranno entrambi l'output come il seguente (jq ancora più colorato):

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

L'enorme vantaggio di jq è che può fare MOLTO di più se desideri analizzare ed elaborare il json.


json_pp era sul mio Mac, ma non su jq. Grazie!
David H,

1
@DavidH - fa questo aiuto: stackoverflow.com/questions/37668134/...
Schmitzi

Grazie! Non avevo mai sentito parlare di jq prima.
David H,

17

jj è superveloce, è in grado di gestire economicamente enormi documenti JSON, non scherza con numeri JSON validi ed è facile da usare, ad es.

jj -p # for reading from STDIN

o

jj -p -i input.json

È (2018) ancora abbastanza nuovo, quindi forse non gestirà JSON non valido nel modo previsto, ma è facile da installare su piattaforme principali.




12

Installa yajl-tools con il seguente comando:

sudo apt-get install yajl-tools

poi,

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


Eccezionale. Non richiede un'altra lingua / interprete ed è nei repository dei pacchetti, non è necessario preparare!
Joseph Lust,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.