it-swarm.com.de

Wie kann ich eine JSON-Datei schön drucken?

Ich habe eine JSON-Datei, die ein Chaos ist, das ich gerne ausdrucken möchte - was ist der einfachste Weg, dies in Python zu tun? Ich weiß, dass PrettyPrint ein "Objekt" akzeptiert, 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.

896
Colleen

Das json -Modul implementiert bereits einige grundlegende hübsche Druckfunktionen 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
        ]
    }
]

Verwenden Sie zum Parsen einer Datei json.load():

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

Sie können dies in der Befehlszeile tun:

python3 -m json.tool < some.json

(wie bereits in den Kommentaren zur Frage erwähnt, danke an @Kai Petzke für den Vorschlag von python3).

Tatsächlich ist python nicht mein Lieblingswerkzeug für die Verarbeitung von JSON in der Befehlszeile. Für einfache hübsche Ausdrucke ist es in Ordnung, aber wenn Sie den JSON manipulieren möchten, kann dies zu kompliziert werden. Sie müssten bald eine separate Skript-Datei schreiben, es könnten Maps entstehen, deren Schlüssel "some-key" (Python-Unicode) sind, was die Auswahl von Feldern erschwert und nicht wirklich in die hübsche Richtung geht -Drucken.

Ich benutze jq . Das obige kann gemacht werden mit:

jq . some.json

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

Nachtrag: In den Kommentaren gibt es einige Verwirrung über die Verwendung von jq zum Verarbeiten großer JSON-Dateien einerseits und über die Verwendung eines sehr großen jq-Programms andererseits. Die praktische Einschränkung für das hübsche Drucken einer Datei, die aus einer einzelnen großen JSON-Entität besteht, ist RAM. Für das hübsche Drucken einer 2-GB-Datei, die aus einem einzigen Array von Daten aus der realen Welt besteht, waren 5 GB (unabhängig davon, ob Sie jq 1.5 oder 1.6 verwenden) als "maximale residente Satzgröße" erforderlich. Beachten Sie auch, dass jq innerhalb von python nach pip install jq verwendet werden kann.

275
Gismo Ranas

Pygementize + Python json.tool = Hübscher Ausdruck mit Syntaxhervorhebung

Pygementize ist ein Killertool. Siehe dies.

Ich kombiniere python json.tool mit pygementize

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

Siehe den Link oben für eine Installationsanleitung.

Eine Demo dazu finden Sie im Bild unten:

demo

46

Sie können das eingebaute Modul pprint verwenden.

Wie Sie die Datei mit json-Daten lesen und ausdrucken können.

import json
import pprint

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

pprint.pprint(json_data)
41
ikreb

Nutzen Sie diese Funktion und denken Sie nicht daran, ob Ihr JSON wieder str oder dict ist - schauen Sie sich nur den hübschen Aufdruck an:

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)
33
zelusp

Um von der Kommandozeile aus hübsch zu drucken und die Kontrolle über den Einzug usw. zu haben, können Sie einen Alias ​​wie diesen einrichten:

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

Verwenden Sie den Alias ​​dann auf eine der folgenden Arten:

cat myfile.json | jsonpp
jsonpp < myfile.json
11
V P

Verwenden Sie pprint: https://docs.python.org/3.6/library/pprint.html

import pprint
pprint.pprint(json)

print() im Vergleich zu pprint.pprint()

print(json)
{'feed': {'title': 'W3Schools Home Page', 'title_detail': {'type': 'text/plain', 'language': None, 'base': '', 'value': 'W3Schools Home Page'}, 'links': [{'rel': 'alternate', 'type': 'text/html', 'href': 'https://www.w3schools.com'}], 'link': 'https://www.w3schools.com', 'subtitle': 'Free web building tutorials', 'subtitle_detail': {'type': 'text/html', 'language': None, 'base': '', 'value': 'Free web building tutorials'}}, 'entries': [], 'bozo': 0, 'encoding': 'utf-8', 'version': 'rss20', 'namespaces': {}}

pprint.pprint(json)
{'bozo': 0,
 'encoding': 'utf-8',
 'entries': [],
 'feed': {'link': 'https://www.w3schools.com',
          'links': [{'href': 'https://www.w3schools.com',
                     'rel': 'alternate',
                     'type': 'text/html'}],
          'subtitle': 'Free web building tutorials',
          'subtitle_detail': {'base': '',
                              'language': None,
                              'type': 'text/html',
                              'value': 'Free web building tutorials'},
          'title': 'W3Schools Home Page',
          'title_detail': {'base': '',
                           'language': None,
                           'type': 'text/plain',
                           'value': 'W3Schools Home Page'}},
 'namespaces': {},
 'version': 'rss20'}
7
Nakamoto

Hier ist ein einfaches Beispiel für das schöne Drucken von JSON auf die Konsole in Python, ohne dass JSON als lokale Datei auf Ihrem Computer installiert sein muss:

import pprint
import json 
from urllib.request import urlopen # (Only used to get this example)

# Getting a JSON example for this example 
r = urlopen("https://mdn.github.io/fetch-examples/fetch-json/products.json")
text = r.read() 

# To print it
pprint.pprint(json.loads(text))
4
David Liu

Ich habe einmal eine prettyjson() -Funktion geschrieben, um eine gut aussehende Ausgabe zu erzeugen. Sie können die Implementierung von this repo abrufen.

Das Hauptmerkmal dieser Funktion ist, dass versucht wird, das Diktat beizubehalten und Elemente in einer Zeile aufzulisten, bis ein bestimmtes maxlinelength erreicht ist. Dadurch werden weniger JSON-Zeilen erzeugt, die Ausgabe wirkt kompakter und einfacher zu lesen.

Sie können diese Art von Ausgabe zum Beispiel erzeugen:

{
  "grid": {"port": "COM5"},
  "policy": {
    "movingaverage": 5,
    "hysteresis": 5,
    "fan1": {
      "name": "CPU",
      "signal": "cpu",
      "mode": "auto",
      "speed": 100,
      "curve": [[0, 75], [50, 75], [75, 100]]
    }
}
3
Andy

Ich denke, dass es besser ist, den json vorher zu analysieren, um Fehler zu vermeiden:

def format_response(response):
    try:
        parsed = json.loads(response.text)
    except JSONDecodeError:
        return response.text
    return json.dumps(parsed, ensure_ascii=True, indent=4)
1
p3quod