2012-10-17 5 views
471

Ich habe eine JSON-Datei, die ein Chaos ist, dass ich prettyprint-- was ist der einfachste Weg, dies in Python zu tun? Ich weiß, dass PrettyPrint ein "Objekt" nimmt, von dem ich denke, dass es eine Datei sein kann, aber ich weiß nicht, wie ich eine Datei weitergeben soll - nur die Verwendung des Dateinamens funktioniert nicht.Wie druckt man eine JSON-Datei?

+6

Versuchen Sie, die JSON parsen Verwenden Sie 'json.loads()' und drucken Sie das resultierende Wörterbuch. Oder gehen Sie einfach zum Abschnitt ** Pretty printing ** von Python [Dokumentation für 'json'] (http://docs.python.org/library/json.html). – Blender

+10

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

+0

@Blender wenn Sie eine Antwort hinterlassen werde ich Ihnen ... Kredit geben könnte dies als Duplikat geschlossen werden, weil Die Lösung ist die gleiche, aber die Frage ist anders, also vielleicht nicht. – Colleen

Antwort

781

Das json Modul bereits implementiert einige grundlegende ziemlich Drucken mit dem indent Parameter:

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

Um eine Datei zu analysieren, verwenden json.load:

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

Für einfaches Pretty-Printing funktioniert das auch ohne explizites Parsen: '' print json.dumps (your_json_string, indent = 4) '' – Peterino

+1

was macht der Einzug? – timbram

+4

@timbram: Dies ist die Anzahl der Leerzeichen, um die eingerückt werden soll. – Blender

148

Sie können diese auf der Kommandozeile tun:

cat some.json | python -m json.tool 

(wie bereits m in den Kommentaren zu der Frage).

Eigentlich Python ist nicht mein Lieblingswerkzeug so weit wie json Verarbeitung auf der Kommandozeile betroffen ist. Für einfaches hübsches Drucken ist ok, aber wenn Sie den JSON manipulieren möchten, kann es übermäßig kompliziert werden. Sie müssten bald eine separate Skript-Datei schreiben, Sie könnten mit Karten enden, deren Schlüssel "some-key" (Python-Unicode) sind, was die Auswahl von Feldern erschwert und nicht wirklich in die Richtung von hübsch geht -Drucken.

Ich verwende jq. Das Obige kann gemacht werden:

cat some.json | jq '' 

und Sie Farben als Bonus (und viel einfacher Erweiterbarkeit) erhalten.

+1

JQ ist großartig, aber es gibt eine maximale Grenze, so dass es für große Dateien nutzlos ist. (Dh die Luft sprengt eine 1.15MB Datei-Handling) https://github.com/stedolan/jq/issues/1041 –

+2

ja, Mann, auf jeden Fall, wenn Sie jq Filter mit mehr als 10K Zeilen Code schreiben, ich glaube, Sie‘ Versuchen Sie etwas wie mit einem Fahrrad zum Mars zu gehen. –

+1

lol: D @ gismo-ranas Die Version json.tool, die in eine Datei piped ist, funktioniert wirklich sehr gut auf großen Dateien; und ist blöd schnell. Ich mag JQ, aber Formatierung alles jenseits einer kleinen Nutzlast (die Sie in den meisten Texteditoren tun könnten) ist außerhalb seiner Reichweite :) Zufälliger Zusatz: http://www.json-generator.com/ ist ein nettes Werkzeug, um Testdaten zu machen –

30

Pygmentize + Python json.tool = Ziemlich Drucken mit Syntax

Hervorhebungen Pygmentize ist ein Killer-Tool. See this.

Ich verbinde Python json.tool mit pygmentize

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

über den Link Siehe pygmentize Installationsanleitung.

Eine Demo ist dies im Bild unten:

demo

+1

In Ihrem Beispiel funktioniert '-g' nicht wirklich;) Da die Eingabe von stdin kommt, kann pygmentize nicht gut raten. Sie müssen lexer explizit angeben: 'echo '{" foo ":" bar "}' | python -m json.tool | pygmentise -l json' –

+0

@DenisTheMenace Es hat im Jahr 2015 funktioniert, als ich dieses Beispielbild erstellt habe. Es scheint jetzt auch nicht auf meinem System zu funktionieren. –

24

Mit dieser Funktion und Schweiß nicht mit sich erinnern, wenn Ihr JSON ein str oder dict wieder - an der hübschen Druck anschauen : Lage sein

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

um ziemlich von der Kommandozeile zu drucken und über die Vertiefung Kontrolle zu haben usw. der Lage sein, können Sie einen Aliasnamen ähnlich wie diese ein:

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

Und dann verwenden Sie den Alias ​​in eine der folgenden Arten:

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

Sie pprint nutzen könnten.

So lesen Sie die Datei mit JSON-Daten und drucken sie aus.

import json 
import pprint 

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

pprint.pprint(json_data) 
2

Hier ist ein einfaches Beispiel für ziemlich Druck JSON an die Konsole in einer schönen Weise in Python, ohne dass die JSON zu erfordern als eine lokale Datei auf Ihrem Computer zu sein:

+0

Ich erhalte die folgende Fehlermeldung in Python 3: "TypeError: das JSON-Objekt muss str sein, nicht 'Bytes'" – MrT