Wie drucke ich eine JSON-Datei?

Lesezeit: 7 Minuten

Benutzer-Avatar
Colleen

Wie kann ich eine JSON-Datei in Python hübsch drucken?

  • Versuchen Sie, den JSON mit zu analysieren json.loads() und drucken Sie das resultierende Wörterbuch hübsch aus. Oder springen Sie einfach zu den Hübscher Druck Abschnitt der Python Dokumentation für json.

    – Mixer

    17. Oktober 2012 um 21:40 Uhr


  • stackoverflow.com/questions/352098/…

    – Hrsg.

    17. Oktober 2012 um 21:42 Uhr

  • @Blender, wenn Sie eine Antwort posten, gebe ich Ihnen Anerkennung … dies wird möglicherweise als Duplikat geschlossen, da die Lösung dieselbe ist, aber die Frage anders ist, also vielleicht nicht.

    – Kolleen

    17. Oktober 2012 um 21:50 Uhr

  • warum nicht <your_file.js python -mjson.tool wie in @eds Link?

    – jfs

    17. Oktober 2012 um 21:56 Uhr

  • Ich glaube nicht, dass es doppelt ist, weil das hübsche Drucken von der Befehlszeile aus nicht dasselbe ist wie das hübsche Drucken programmgesteuert von Python. Abstimmung zur Wiedereröffnung.

    – vitaut

    16. September 2015 um 15:31 Uhr


Benutzer-Avatar
Mixer

Das json Modul implementiert bereits einige grundlegende hübsche Drucke in der dump und dumps Funktionen, mit der indent Parameter, der angibt, um wie viele Leerzeichen eingerückt werden soll:

>>> 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 Analysieren einer Datei json.load():

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

  • Für einfaches Pretty-Printing funktioniert dies auch ohne explizites Parsing: print json.dumps(your_json_string, indent=4)

    – Peterino

    4. August 2014 um 14:07 Uhr

  • Ohne den Einzug erhalten Sie nur eine einzelne Zeile mit hässlichem Text, weshalb ich hierher gekommen bin.

    – krs013

    16. März 2016 um 18:46 Uhr

  • Dies ähnelt JavaScript var str = JSON.stringify(obj, null, 4); wie hier diskutiert stackoverflow.com/questions/4810841/…

    – Christoph Roussy

    31. Mai 2016 um 13:17 Uhr


  • @Peterino, es funktioniert nicht ohne explizites Parsen. Es gibt eine Escape-Zeile aus

    – ACV

    2. Juli 2021 um 16:24 Uhr

  • Im hübscheren JS-Tool wird kein “Zeilenumbruch” hinzugefügt, wenn die Linienbreite weniger als 80 beträgt. Ich suche danach.

    – Peterlits Zo

    22. Februar um 6:28 Uhr

Benutzer-Avatar
Gismo Ranas

Sie können dies auf 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 python3-Vorschlag).

Eigentlich ist Python nicht mein Lieblingstool, was die JSON-Verarbeitung auf der Befehlszeile betrifft. Für einfaches, hübsches Drucken ist es in Ordnung, aber wenn Sie den Json manipulieren möchten, kann es zu kompliziert werden. Sie müssten bald eine separate Skript-Datei schreiben, Sie könnten am Ende Karten haben, deren Schlüssel u”some-key” (python unicode) sind, was die Auswahl von Feldern erschwert und nicht wirklich in die Richtung von hübsch geht -Drucken.

Sie können auch verwenden jq:

jq . some.json

und Sie erhalten Farben als Bonus (und eine viel einfachere Erweiterbarkeit).

Nachtrag: Es gibt einige Verwirrung in den Kommentaren über die Verwendung von jq zur Verarbeitung großer JSON-Dateien einerseits und die Verwendung eines sehr großen jq-Programms andererseits. Für den hübschen Druck einer Datei, die aus einer einzigen großen JSON-Entität besteht, ist die praktische Einschränkung der Arbeitsspeicher. Für das Pretty-Printing einer 2-GB-Datei, die aus einem einzelnen Array von realen Daten besteht, betrug die für das Pretty-Printing erforderliche “maximale residente Satzgröße” 5 GB (unabhängig davon, ob jq 1.5 oder 1.6 verwendet wird). Beachten Sie auch, dass jq danach innerhalb von Python verwendet werden kann pip install jq.

  • JQ ist großartig, aber es gibt eine maximale Grenze, daher ist es für große Dateien nutzlos. (dh explodiert beim Umgang mit einer 1,15-MB-Datei) github.com/stedolan/jq/issues/1041

    – Chris McKee

    17. Mai 2016 um 8:35 Uhr

  • Ja, Mann, auf jeden Fall, wenn Sie jq-Filter mit mehr als 10.000 Codezeilen schreiben, versuchen Sie, glaube ich, so etwas wie mit einem Fahrrad zum Mars zu fahren.

    – Gismo Ranas

    17. Mai 2016 um 8:39 Uhr

  • lol 😀 @gismo-ranas Die json.tool-Version, die an eine Datei geleitet wird, funktioniert bei großen Dateien wirklich sehr gut. und ist verdammt schnell. Ich mag JQ, aber das Formatieren von allem, was über eine kleine Nutzlast hinausgeht (was Sie in den meisten Texteditoren tun könnten), ist außerhalb seiner Reichweite 🙂 Zufällige Ergänzung: json-generator.com ist ein nettes Werkzeug, um Testdaten zu machen

    – Chris McKee

    17. Mai 2016 um 8:46 Uhr


  • oder nur: jq '' < some.json

    – fataler Fehler

    9. Dezember 2016 um 19:21 Uhr

  • Eigentlich empfehle ich dringend die Verwendung python3 -m json.tool <IN >OUT, da dies die ursprüngliche Reihenfolge der Felder in JSON-Dikten beibehält. Der Python-Interpreter Version 2 sortiert die Felder alphabetisch aufsteigend, was oft nicht erwünscht ist.

    – Kai Petzke

    20. Januar 2019 um 17:00 Uhr

Benutzer-Avatar
ikreb

Sie könnten das eingebaute Modul verwenden pprint (https://docs.python.org/3.9/library/pprint.html).

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

import json
import pprint

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

print(json_data)
{"firstName": "John", "lastName": "Smith", "isAlive": "true", "age": 27, "address": {"streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021-3100"}, 'children': []}

pprint.pprint(json_data)
{'address': {'city': 'New York',
             'postalCode': '10021-3100',
             'state': 'NY',
             'streetAddress': '21 2nd Street'},
 'age': 27,
 'children': [],
 'firstName': 'John',
 'isAlive': True,
 'lastName': 'Smith'}

Die Ausgabe ist kein gültiger JSON, da pprint einfache Anführungszeichen verwendet und die JSON-Spezifikation doppelte Anführungszeichen erfordert.

Wenn Sie den hübsch gedruckten json in eine Datei umschreiben möchten, müssen Sie verwenden pprint.pformat.

pretty_print_json = pprint.pformat(json_data).replace("'", '"')

with open('file_name.json', 'w') as f:
    f.write(pretty_print_json)

  • Das Problem dabei ist, dass pprint einfache und doppelte Anführungszeichen austauschbar verwendet, json jedoch nur doppelte Anführungszeichen benötigt, sodass Ihr pprinted json möglicherweise nicht mehr als gültiger json analysiert wird.

    – Dreviko

    29. Juni 2018 um 14:38 Uhr

  • Ja, aber nur um eine JSON-Datei auszugeben. Nicht die Ausgabe zu nehmen und wieder in eine Datei zu schreiben.

    – ikreb

    9. Juli 2018 um 14:01 Uhr

  • Die Frage besagt ausdrücklich, dass eine JSON-Datei hübsch gedruckt werden soll, keine Python-Darstellung einer JSON-Datei

    – Daniel Farell

    10. November 2021 um 16:37 Uhr

  • @DanielFarrell Du hast Recht. Vielen Dank. Ich habe meine Antwort aktualisiert.

    – ikreb

    24. November 2021 um 14:37 Uhr

Benutzer-Avatar
Shubham Chaudhary

Pygmentize + Python json.tool = Schöner Druck mit Syntaxhervorhebung

Pygmentize ist ein Killer-Tool. Sieh dir das an.

Ich kombiniere python json.tool mit pygmentize

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

Unter dem obigen Link finden Sie eine Installationsanleitung für die Pygmentisierung.

Eine Demo davon ist im Bild unten:

Demo

Benutzer-Avatar
zelusp

Verwenden Sie diese Funktion und müssen Sie sich nicht daran erinnern, ob Ihr JSON eine ist str oder dict nochmal – schau dir 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)

Benutzer-Avatar
Oliver

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

import pprint
pprint.pprint(json)

print() verglichen mit 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'}

Benutzer-Avatar
VP

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

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 ​​auf eine der folgenden Arten:

cat myfile.json | jsonpp
jsonpp < myfile.json

1158640cookie-checkWie drucke ich eine JSON-Datei?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy