2012-10-17 4 views
471

Ho un file JSON che è un disastro che voglio fare con prettyprint - qual è il modo più semplice per farlo in python? So che PrettyPrint prende un "oggetto", che a mio avviso può essere un file, ma non so come passare un file in-- basta usare il nome del file non funziona.Come stampare un file JSON?

+6

Cercare di analizzare il JSON usando 'json.loads()' e stampiamo il dizionario risultante. Oppure vai alla sezione ** Pretty printing ** di Python [documentazione per 'json'] (http://docs.python.org/library/json.html). – Blender

+10

http://stackoverflow.com/questions/352098/how-to-pretty-print-json-script –

+0

@Blender se pubblichi una risposta ti darò credito ... questo potrebbe essere chiuso come duplicato, perché la soluzione è la stessa, ma la domanda è diversa, quindi forse no. – Colleen

risposta

781

Il modulo json implementa già un po 'di stampa piuttosto semplice con il parametro indent:

>>> import json 
>>> 
>>> your_json = '["foo", {"bar":["baz", null, 1.0, 2]}]' 
>>> parsed = json.loads(your_json) 
>>> print json.dumps(parsed, indent=4, sort_keys=True) 
[ 
    "foo", 
    { 
     "bar": [ 
      "baz", 
      null, 
      1.0, 
      2 
     ] 
    } 
] 

di analizzare un file, utilizzare json.load:

with open('filename.txt', 'r') as handle: 
    parsed = json.load(handle) 
+56

Per una semplice stampa carina funziona anche senza analisi esplicita: '' stampa json.dumps (your_json_string, indent = 4) '' – Peterino

+1

cosa fa il rientro? – timbram

+4

@timbram: è il numero di spazi da utilizzare per il rientro. – Blender

148

Si può fare questo sulla riga di comando:

cat some.json | python -m json.tool 

(come già m inserito nei commenti alla domanda).

In realtà Python non è il mio strumento preferito per quanto riguarda l'elaborazione JSON sulla riga di comando. Per la semplice stampa carina è ok, ma se vuoi manipolare il json può diventare complicato. Avresti presto bisogno di scrivere un file di script separato, potresti finire con mappe le cui chiavi sono "some-key" (python unicode), il che rende la selezione dei campi più difficile e non va nella direzione di pretty -stampa.

Io uso jq. Quanto sopra può essere fatto con:

cat some.json | jq '' 

e si ottengono colori come bonus (e modo più facile estensibilità).

+1

JQ è ottimo ma c'è un limite massimo quindi è inutile per file di grandi dimensioni. (es. esplode maneggiando un file da 1.15mb) https://github.com/stedolan/jq/issues/1041 –

+2

sì, amico, sicuramente, se stai scrivendo filtri jq con più di 10K di codice penso che tu sia stai provando qualcosa come andare su Marte con una bicicletta. –

+1

lol: D @ gismo-ranas La versione json.tool collegata a un file funziona davvero molto bene su file di grandi dimensioni; ed è stupidamente veloce. Mi piace JQ ma la formattazione di qualsiasi cosa oltre un piccolo carico utile (che si potrebbe fare nella maggior parte degli editor di testo) è fuori dalla sua portata :) Aggiunta casuale: http://www.json-generator.com/ è uno strumento accurato per creare dati di test –

30

pygmentize + Python json.tool = Abbastanza Stampa con evidenziazione della sintassi

pygmentize è uno strumento assassino. See this.

combino pitone json.tool con pygmentize

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

Vedi il link qui sopra per istruzioni di installazione pygmentize.

Una demo di questo è nell'immagine qui sotto:

demo

+1

Nel tuo esempio '-g' in realtà non funziona;) Poiché l'input proviene da stdin, pygmentize non è in grado di fare una buona ipotesi. È necessario specificare esplicitamente il lexer: 'echo '{" foo ":" bar "}' | python -m json.tool | pygmentize -l json' –

+0

@DenisTheMenace Funzionava nel 2015 quando ho creato questa immagine di esempio. Non sembra che funzioni ora anche sul mio sistema. –

24

Usare questa funzione e non sudare dover ricordare se il vostro è un JSON str o dict ancora - basta guardare la bella stampa :

import json 

def pp_json(json_thing, sort=True, indents=4): 
    if type(json_thing) is str: 
     print(json.dumps(json.loads(json_thing), sort_keys=sort, indent=indents)) 
    else: 
     print(json.dumps(json_thing, sort_keys=sort, indent=indents)) 
    return None 

pp_json(your_json_string_or_dict) 
7

per essere in grado di stampare praticamente dalla linea di comando e di essere in grado di avere il controllo su l'indentazione, ecc è possibile impostare un alias simile a questo:

alias jsonpp="python -c 'import sys, json; print json.dumps(json.load(sys.stdin), sort_keys=True, indent=2)'" 

e quindi utilizzare l'alias in uno dei seguenti modi:

cat myfile.json | jsonpp 
jsonpp < myfile.json 
6

Si potrebbe utilizzare pprint.

Come leggere il file con dati json e stamparlo.

import json 
import pprint 

with open('filename.txt', 'r') as f: 
    json_data = json.load(f.read()) 

pprint.pprint(json_data) 
2

Ecco un semplice esempio di stampa piuttosto JSON per la console in un bel modo in Python, senza richiedere l'JSON di essere sul computer come un file locale:

+0

Ottengo il seguente messaggio di errore in Python 3: "TypeError: l'oggetto JSON deve essere str, non 'byte'" – MrT