2013-05-01 8 views
12

Immer wenn ich versuche, Json aus Python auszudrucken, ignoriert es Zeilenumbrüche und druckt die Literalzeichenfolge "\ n" anstelle neuer Zeilenzeichen.Kann Json von Python nicht hübsch drucken

Ich erzeuge Json mit Jinja2. Hier ist mein Code:

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

Es druckt alles im Block unten (wörtlich - auch die Zitate und "\ n" Strings):

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

(abgeschnitten)

ich etwas bekommen So, wenn ich versuche, alles außer einem Diktat zu verschwenden. Selbst wenn ich json.loads() versuche und dann wieder dump mache, bekomme ich Müll. Es löscht nur alle Zeilenumbrüche.

Was läuft falsch?

Antwort

17

Dies ist, was ich für ziemlich Druck json-Objekte verwenden:

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() akzeptiert auch Parameter für die Codierung, wenn Sie Nicht-ASCII-Unterstützung benötigen.

+2

Nein, das funktioniert nicht. Es spricht das Problem nicht mit der Tatsache an, dass 'Drucken' tatsächlich "\ n" anstatt neuer Zeilenzeichen druckt. – user1491250

+2

Es funktioniert, wenn Sie das JSON-_object_ (oder besser das Dict in Python) als Eingabe für 'json.dumps()' verwenden. Wenn Sie bereits ein JSON-Objekt als String haben, brauchen Sie 'json.dumps()' nicht mehr. – felixbr

+0

wenn ich 'dat = json.loads (payload.content)' wo 'type (payload)' ist '' und 'type (dat)' ist '', 'json.dumps (dat, indent = 4)' zeigt immer noch die '\ n'-Zeichen in der Konsolenausgabe und 'json.dumps (payload.content, indent = 4)' 'zeigt eine ganze Reihe von' \\ 'Zeichen und keine Vertiefung. Fehle ich hier etwas? EDIT: Ja, sieht so aus, als müsste ich 'print (json.dumps (dat, indent = 4))' machen, damit es in der interaktiven Konsolensitzung funktioniert. – user5359531

7

json.dumps() gibt eine JSON-codierte Zeichenfolge zurück. Der JSON-Standard schreibt vor, dass Zeilenumbrüche als \\n codiert werden, die dann als \n gedruckt wird:

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

Es gibt nicht viel Sie tun können, das ändern, wenn Sie einen gültigen JSON-String behalten mögen. Wenn Sie es ausdrucken möchten, wäre der richtige Weg, um die JSON Objekt, nicht seine String-Darstellung zu drucken:

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

Ich weiß. Wie mache ich entweder json.dumps geben neue Zeilen Zeichen anstelle des Literals, oder wie mache ich Druck interpolieren sie anstelle des literalen drucken? – user1491250

+0

@ user1491250: Sie * haben es * noch nicht gedruckt. Wenn Sie hatten, wären die Zeilenumbrüche sichtbar. Sie haben die Python-Shell den Rückgabewert anzeigen, und das geschieht mit dem 'repr' der Zeichenfolge. –

+0

aktualisiert. Ja, habe ich. Das Problem besteht darin, dass beim Drucken anstelle der neuen Zeilen die Zeichenfolge "\ n" ausgegeben wird. deshalb frage ich. – user1491250

0

Wenn die Zeichenfolge bereits JSON dann ist es ziemlich Drucken mit

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

Das ist das Problem, dass Ihre Eingabe in json.dumps ein string ist. Versuchen Sie Folgendes:

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

Es Sie tun dies, etc einrücken ... versuchen Sie Folgendes:

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