2013-05-01 14 views
12

Ogni volta che provo a stampare json da python, ignora le interruzioni di riga e stampa la stringa letterale "\ n" invece dei caratteri di nuova riga.Impossibile stampare json da python

Sto generando json utilizzando jinja2. Qui è il mio codice:

print json.dumps(template.render(**self.config['templates'][name])) 

esso stampa tutto in blocco sotto (letteralmente - anche le citazioni e "\ n" stringhe):

"{\n \"AWSTemplateFormatVersion\" : \"2010-09-09\",\n \"Description\" : ... 

(troncato)

ho qualcosa come questo ogni volta che provo a buttare tutto tranne un ditt. Anche se provo json.loads() e poi lo scarico di nuovo, ottengo la spazzatura. Rimuove solo tutte le interruzioni di riga.

Cosa non va?

risposta

17

Questo è quello che uso per quasi-stampa JSON-oggetti:

def get_pretty_print(json_object): 
    return json.dumps(json_object, sort_keys=True, indent=4, separators=(',', ': ')) 

print get_pretty_print(my_json_obj) 

json.dumps() accetta anche i parametri per la codifica, se è necessario il supporto non-ascii.

+2

No, questo non funziona. Non affronta il problema con il fatto che "stampa" stampa effettivamente "\ n" invece di caratteri di nuova riga. – user1491250

+2

Funziona se si usa JSON-_object_ (o meglio il dict in python) come input per 'json.dumps()'. Se hai già un oggetto JSON rappresentato come stringa, non avrai più bisogno di 'json.dumps()'. – felixbr

+0

se eseguo 'dat = json.loads (payload.content)' dove 'type (payload)' è '' e 'type (dat)' è '', 'json.dumps (dat, indent = 4)' mostra ancora i caratteri '\ n' nell'output della console, e' json.dumps (payload.content, indent = 4) 'mostra una sfilza di' 'caratteri' e no indentazione. Mi sto perdendo qualcosa qui? EDIT: sì, sembra che dovevo fare 'print (json.dumps (dat, indent = 4))' per farlo funzionare nella sessione della console interattiva. – user5359531

7

json.dumps() restituisce una stringa con codifica JSON. I mandati JSON standard che a capo sono codificati come \\n, che viene poi stampati come \n:

>>> s="""hello 
... there""" 
>>> s 
'hello\nthere' 
>>> json.dumps(s) 
'"hello\\nthere"' 
>>> print(json.dumps(s)) 
"hello\nthere" 

Non c'è molto che potete fare per cambiare la situazione, se si desidera mantenere una stringa JSON valido. Se si desidera stampare, il modo corretto sarebbe quello di stampare l'oggetto JSON , non la sua rappresentazione di stringa:

>>> print(s) 
hello 
there 
>>> print(json.loads(json.dumps(s))) # pointless; just for demonstration... 
hello 
there 
+0

lo so. Come posso fare in modo che json.dumps restituisca i caratteri della nuova riga invece del letterale, o come faccio a farli interpolare invece di stampare il letterale? – user1491250

+0

@ user1491250: * non lo * stato ancora stampato. Se lo avessi, le interruzioni di riga sarebbero visibili. Stai facendo in modo che la shell Python visualizzi il valore restituito, e ciò viene fatto usando il 'repr' della stringa. –

+0

aggiornato. sì. il problema è che stampando stampa la stringa "\ n" letterale invece delle nuove righe. è per questo che lo sto chiedendo – user1491250

0

Se la stringa è già JSON allora abbastanza stamparlo utilizzando

def pp_json(json_string): 
# converts json to dict then back to string... ridiculous but not pointless 
    print(json.dumps(json.loads(json_string), sort_keys=True, indent=4)) 
    return 

pp_json(your_json_string) 
0

Il problema è che il vostro input per json.dumps è un string. Provare quanto segue:

print type(template.render(**self.config['templates'][name])) 

E si sta facendo questo per far rientrare ecc ... provare quanto segue:

print json.dumps(json.loads(template.render(**self.config['templates'][name])), sort_keys=True, indent=4)