3647 Stimmen

Wie kann ich JSON in einem Shell-Skript hübsch ausdrucken?

Gibt es ein (Unix-)Shell-Skript zur Formatierung von JSON in menschenlesbarer Form?

Im Grunde genommen möchte ich, dass es das Folgende umwandelt:

{ "foo": "lorem", "bar": "ipsum" }

... zu etwas wie diesem:

{
    "foo": "lorem",
    "bar": "ipsum"
}

0 Stimmen

10 Stimmen

Ich habe vor einiger Zeit meine eigenen gedreht: github.com/exhuma/braindump/tree/master/jsonformat Der Code ist sehr einfach und verwendet Python's eigene json Bibliothek, aber ich habe auch pygments hinzugefügt, um eine Syntaxhervorhebung zu erhalten.

0 Stimmen

Ich bin über diese Seite gestolpert und habe dann Folgendes gefunden Json Hübsch und ich mag es sehr. Typekit verwendet es in ihren API-Beispielen, so gibt es einige klout hinter ihm ^^

75voto

Tadej Punkte 5745

So mache ich das:

curl yourUri | json_pp

Er verkürzt den Code und erledigt die Aufgabe.

4 Stimmen

Ubuntu-Server: Wenn Sie Produktionsrechner mit sehr eingeschränkten Installationen haben, könnte dies die beste Wahl sein, da es standardmäßig unter einem bestimmten Namen installiert ist. Python wird oft auf unterschiedliche Weise installiert (z. B. python3, python oder gar nicht), je nach Version.

1 Stimmen

Funktioniert für Mac :)

74voto

Daryl Spitzer Punkte 131841

Unter *nix funktioniert es besser, von stdin zu lesen und nach stdout zu schreiben:

#!/usr/bin/env python
"""
Convert JSON data to human-readable form.

(Reads from stdin and writes to stdout)
"""

import sys
try:
    import simplejson as json
except:
    import json

print json.dumps(json.loads(sys.stdin.read()), indent=4)
sys.exit(0)

Geben Sie dies in eine Datei ein (ich nannte meine "prettyJSON" nach AnC 's Antwort) in Ihrem PATH und chmod +x und Sie sind startklar.

0 Stimmen

In der Tat ist die Verwendung von stdin/stdout viel flexibler und einfacher. Danke für den Hinweis.

3 Stimmen

Für Programme, die eine benannte Datei erwarten, verwenden Sie /dev/stdin, dito für out und err.

4 Stimmen

ZU IHRER INFORMATION fileinput.input() liest von stdin, wenn in der Befehlszeile keine Dateien angegeben sind. Beispiel

68voto

jfs Punkte 370717
$ echo '{ "foo": "lorem", "bar": "ipsum" }' \
> | python -c'import fileinput, json;
> print(json.dumps(json.loads("".join(fileinput.input())),
>                  sort_keys=True, indent=4))'
{
    "bar": "ipsum",
    "foo": "lorem"
}

HINWEIS: Es ist nicht die Weise zu tun.

Das gleiche in Perl:

$ cat json.txt \
> | perl -0007 -MJSON -nE'say to_json(from_json($_, {allow_nonref=>1}), 
>                                     {pretty=>1})'
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

Anmerkung 2: Wenn Sie das Programm

echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
| python -c'import fileinput, json;
print(json.dumps(json.loads("".join(fileinput.input())),
                 sort_keys=True, indent=4))'

wird das schön lesbare Wort \u verschlüsselt

{
    "D\u00fcsseldorf": "lorem", 
    "bar": "ipsum"
}

Wenn der Rest Ihrer Pipeline mit Unicode zurechtkommt und Sie möchten, dass Ihr JSON auch menschenfreundlich ist, können Sie einfach verwenden. ensure_ascii=False

echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
| python -c'import fileinput, json;
print json.dumps(json.loads("".join(fileinput.input())),
                 sort_keys=True, indent=4, ensure_ascii=False)'

und Sie erhalten:

{
    "Düsseldorf": "lorem", 
    "bar": "ipsum"
}

0 Stimmen

Eigentlich tue ich das gleiche, aber mit Javascript selbst :)

2 Stimmen

In der Version des JSON-Moduls, die ich habe, to_json scheint keine Optionen zu akzeptieren. Aber dies funktioniert: perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json

2 Stimmen

Das Python-Beispiel könnte vereinfacht werden. Es ist viel einfacher, die JSON-Ausgabe direkt in python -m json.tool .

68voto

Paul Horsfall Punkte 8002

Der JSON Ruby Gem ist mit einem Shell-Skript gebündelt, um JSON zu verschönern:

sudo gem install json
echo '{ "foo": "bar" }' | prettify_json.rb

Skript herunterladen: gist.github.com/3738968

7 Stimmen

Beachten Sie, dass diese Lösung den Unicode " \uxxxx "Escape-Sequenzen, im Gegensatz zur Python-Sequenz mit json.tool . Allerdings scheint es auch Einschränkungen bei der Schachtelungstiefe zu geben ( nesting of 20 is too deep (JSON::NestingError) ).

2 Stimmen

Auf Ubuntu können Sie tun: sudo apt-get install ruby-json-pure anstelle von gem install

1 Stimmen

```eric-mbp:~ ericstob$ sudo gem install json Passwort: Holt: json-1.7.3.gem (100%) Native Erweiterungen bauen. Das könnte eine Weile dauern... Erfolgreiche Installation von json-1.7.3 1 gem installiert Installation der ri-Dokumentation für json-1.7.3... Installiere RDoc-Dokumentation für json-1.7.3... eric-mbp:~ ericstob$ prettify_json.rb -bash: prettify_json.rb: Befehl nicht gefunden

60voto

jordelver Punkte 8094

UPDATE Ich benutze jq jetzt, wie in einer anderen Antwort vorgeschlagen. Es ist extrem leistungsfähig bei der Filterung von JSON, aber, an seiner grundlegendsten, auch ein awesome Weg, um JSON für die Anzeige schön drucken.

jsonpp ist ein sehr schöner JSON-Drucker für die Kommandozeile.

Aus der README:

Pretty print Web-Service-Antworten wie folgt:

curl -s -L http://<!---->t.co/tYTq5Pu | jsonpp

und machen Sie die Dateien, die auf Ihrer Festplatte herumlaufen, schön:

jsonpp data/long_malformed.json

Wenn Sie mit Mac OS X arbeiten, können Sie brew install jsonpp . Wenn dies nicht der Fall ist, können Sie die Binärdatei einfach an eine Stelle in Ihrem $PATH .

1 Stimmen

Ich habe jsonpp (in der Vergangenheit erfolgreich verwendet) gegen eine große Datei (>60MB) ausprobiert. Ich habe es nach 5 Minuten abgebrochen. Ich leitete es in python -mjson.tool (aus einer anderen Antwort hier) und es dauerte 10-20sec...

0 Stimmen

60 MB JSON? Wow! Ich habe normalerweise nicht mit so großen Dateien zu tun, aber es ist nützlich zu wissen. Danke!

0 Stimmen

Auf meiner Ubuntu-Box habe ich eine json_pp - das json schön formatiert, obwohl ich glaube, dass dies trotz der Ähnlichkeit in der Namensgebung ein völlig anderes Projekt ist als das jsonpp hier erwähnt

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X