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


3061

Gibt es ein (Unix-) Shell-Skript zum Formatieren von JSON in lesbarer Form?

Grundsätzlich möchte ich, dass es Folgendes transformiert:

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

... in so etwas:

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


7
Ich habe vor kurzem meine eigene gerollt: github.com/exhuma/braindump/tree/master/jsonformat Der Code ist sehr einfach und verwendet die eigene Python- jsonBibliothek, aber ich habe auch Pygemente hinzugefügt, um die Syntax hervorzuheben.
Exhuma

Stolperte darüber, fand dann aber Json Pretty und ich mag es sehr. Typekit verwendet es in ihren API-Beispielen, daher steckt etwas Klout dahinter ^^
Nick Tomlin

Wenn es Ihnen nichts ausmacht, das Einfügen zu kopieren, gibt es auch einige einfache Online-Tools wie jsonprettyprint.net, mit denen Sie Ihren unformatierten JSON schnell und hübsch drucken können.
Javaaaa

7
Seien Sie gewarnt: python -m json.tool erzeugt nicht immer gültigen JSON. (Hinweis: 1e1000)
Peak

Antworten:


4460

Mit Python 2.6+ können Sie einfach Folgendes tun:

echo '{"foo": "lorem", "bar": "ipsum"}' | python -m json.tool

Wenn sich der JSON in einer Datei befindet, können Sie Folgendes tun:

python -m json.tool my_json.json

Wenn der JSON aus einer Internetquelle wie einer API stammt, können Sie ihn verwenden

curl http://my_url/ | python -m json.tool

In all diesen Fällen können Sie der Einfachheit halber einen Alias ​​erstellen:

alias prettyjson='python -m json.tool'

Für noch mehr Komfort mit etwas mehr Eingabe, um es fertig zu machen:

prettyjson_s() {
    echo "$1" | python -m json.tool
}

prettyjson_f() {
    python -m json.tool "$1"
}

prettyjson_w() {
    curl "$1" | python -m json.tool
}

für alle oben genannten Fälle. Sie können dies eingeben .bashrcund es wird jedes Mal in der Shell verfügbar sein. Rufe es wie auf prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'.


73
Sie können dies weiterleiten, pygmentize -l javascriptum eine syntaxfarbene Ausgabe in Ihrer Befehlszeile zu erhalten. Bearbeiten : Wenn Sie Pygements installiert haben, ist das.
Shrikant Sharat

177
Eine große Antwort, Vorsicht habe ich nur mit ihm ist es tut Art die Tasten auf Ausgang - die Sie sich bewusst sein , brauchen könnte.
Chris Nash

14
In myy .vimrc "nnoremap <f5>:%! Python -m json.tool <CR>: w <CR>"
imwilsonxu

40
Dies scheint Unicode-Zeichen in \ uXXXX zu entkommen, was ein Nachteil sein könnte.
user1071136

14
Ich habe einen Alias ​​erstellt: alias pretty='python -mjson.tool | pygmentize -l jsondamit ich einfach ausführen kann : command params | pretty. Hoffe das hilft. PS: Sollte es jemandem gelingen, dies zu erweitern, um a) die Curl-Ausgabe, die ich jedes Mal sehe, zu entfernen und / oder b) die JSON-Schlüssel NICHT zu sortieren; Bitte lassen Sie es mich wissen, ich werde sehr dankbar sein.
Clint Eastwood

1023

Sie können verwenden: jq

Es ist sehr einfach zu bedienen und funktioniert hervorragend! Es kann sehr große JSON-Strukturen, einschließlich Streams, verarbeiten. Ihre Tutorials finden Sie hier .

Anwendungsbeispiele:

$ jq --color-output . file1.json file1.json | less -R

$ command_with_json_output | jq .

$ jq . # stdin/"interactive" mode, just enter some JSON

$ jq . <<< '{ "foo": "lorem", "bar": "ipsum" }'
{
  "bar": "ipsum",
  "foo": "lorem"
}

Das . ist der Identitätsfilter.


11
Es gibt auch eine --sort-keysOption, die in einigen Fällen hilfreich ist.
Matthew Flaschen

9
Arbeiten mit Locken:curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
Hover Ruan

19
"jq." ist als hübscher Drucker großartig, hat aber eine Einschränkung: jq (bis einschließlich jq Version 1.5) ändert die Werte sehr großer und sehr kleiner Zahlen, da numerische Werte als IEEE 754 64-Bit-Werte analysiert werden. Versuchen Sie diesen Wert: 1e1000, um zu überprüfen, ob Ihr Lieblingsdrucker das gleiche Problem hat. Beachten Sie, dass python -mjson.tool diesen Test insofern schlecht besteht, als es Infinity erzeugt, das nicht einmal JSON ist.
Peak

1
Als Hinweis können Sie das formatierte Ergebnis in eine Datei umleiten : echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfile.
Tschad

26
@ Meekohi die Alternative ist "unnötige Verwendung von Echo". Super froh, den <<<Betreiber gefunden zu haben - genau das, wonach ich gesucht habe.
Jchook

381

Ich benutze das "Leerzeichen" -Argument von JSON.stringify, um JSON in JavaScript hübsch zu drucken.

Beispiele:

// Indent with 4 spaces
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, 4);

// Indent with tabs
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, '\t');

Geben Sie in der Unix-Befehlszeile mit Node.js JSON in der Befehlszeile an:

$ node -e "console.log(JSON.stringify(JSON.parse(process.argv[1]), null, '\t'));" \
  '{"foo":"lorem","bar":"ipsum"}'

Kehrt zurück:

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

Geben Sie in der Unix-Befehlszeile mit Node.js einen Dateinamen an, der JSON enthält, und verwenden Sie einen Einzug mit vier Leerzeichen:

$ node -e "console.log(JSON.stringify(JSON.parse(require('fs') \
      .readFileSync(process.argv[1])), null, 4));"  filename.json

Mit einem Rohr:

echo '{"foo": "lorem", "bar": "ipsum"}' | node -e \
"\
 s=process.openStdin();\
 d=[];\
 s.on('data',function(c){\
   d.push(c);\
 });\
 s.on('end',function(){\
   console.log(JSON.stringify(JSON.parse(d.join('')),null,2));\
 });\
"

10
Zum Debuggen von Objekten in Node.js sollten Sie wirklich sys.inspect () anstelle von JSON.stringify () verwenden. Hier ist der Grund: markhansen.co.nz/inspecting-with-json-stringify
Gurpartap Singh

11
Abgestimmt. Das OP handelt von einem "* nix-Befehlszeilenskript", und diese Antwort ist ein anderer Kontext.
Danorton

49
@danorton: JS kann über die Befehlszeile über node.js und andere ähnliche Lösungen verwendet werden.
Calvinf

10
Die Konsole wird nicht benötigt: node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"Das Ergebnis wird auch an STDOUT ausgegeben.
Julian D.

2
Es ist schade, dass das Skript für einen Dateinamen gegen stdin anders ist
Lukasz Wiktor

340

Ich habe ein Tool geschrieben, das einen der besten verfügbaren "Smart Whitespace" -Formatierer enthält. Es erzeugt eine besser lesbare und weniger ausführliche Ausgabe als die meisten anderen Optionen hier.

Unterstrich-Cli

So sieht "Smart Whitespace" aus:

Ich bin vielleicht ein bisschen voreingenommen, aber es ist ein großartiges Tool zum Drucken und Bearbeiten von JSON-Daten über die Befehlszeile. Es ist sehr benutzerfreundlich und verfügt über eine umfangreiche Hilfe / Dokumentation zur Befehlszeile. Es ist ein Schweizer Taschenmesser, das ich für 1001 verschiedene kleine Aufgaben verwende, die auf andere Weise überraschend ärgerlich wären.

Letzter Anwendungsfall: Chrome, Dev-Konsole, Registerkarte "Netzwerk", alle als HAR-Datei exportieren, "cat site.har | Unterstrich select '.url' --outfmt text | grep mydomain"; Jetzt habe ich eine chronologisch geordnete Liste aller URL-Abrufe, die beim Laden der Website meines Unternehmens erstellt wurden.

Hübsches Drucken ist einfach:

underscore -i data.json print

Gleiche Sache:

cat data.json | underscore print

Gleiches, expliziter:

cat data.json | underscore print --outfmt pretty

Dieses Tool ist mein aktuelles Leidenschaftsprojekt. Wenn Sie also Feature-Anfragen haben, besteht eine gute Chance, dass ich diese anspreche.


4
Ich habe auch mein ~ / .bash_profile so aktualisiert, dass es die folgende Zeile enthält: alias underscor = 'underscore print --outfmt hübsch' jetzt kann ich nur noch curl example.com/result.json | ausführen Unterstrich und weiterhin Unterstrich für andere Formatierungen verwenden
Gal Bracha

Danke Dave! Werkzeug ist gut! Alias ​​Pretty-Json = "Underrsore Pretty" und Curl-Ausgabe gefällt einem Auge
Maxim Ponomarev

Tolles Formatierungswerkzeug, nur ein Hinweis: Das Weiterleiten der Ausgabe an eine Datei (entweder mit der Option -o oder mit > ) funktioniert nur mit Unterstrich . Unterstreichungs ziemlich speichert eine Datei mit Farb Formatierung Zeichen eingefügt werden, smth wie: [32m, [33m, [39mzusammen mit einigen nicht-druckbare vor jedem von ihnen, die JSON nicht gültig machen. Allerdings Strich Druck allein nicht alles in eine Datei hinzufügen , und macht seinen Job Formatierung perfekt.
Tiurin

Ich liebe, jqaber das hat großartig funktioniert für meinen "JSON", der keine doppelt zitierten Schlüssel hatte.
Bluu

@ DaveDopson danke für das tolle Tool !! Ich werde versuchen, es neben jsonselect.org/#tryit zu verwenden ...
mycargus

173

Normalerweise mache ich einfach:

echo '{"test":1,"test2":2}' | python -mjson.tool

Und um ausgewählte Daten abzurufen (in diesem Fall den Wert von "test"):

echo '{"test":1,"test2":2}' | python -c 'import sys,json;data=json.loads(sys.stdin.read()); print data["test"]'

Wenn sich die JSON-Daten in einer Datei befinden:

python -mjson.tool filename.json

Wenn Sie alles auf einmal erledigen möchten, gehen Sie curlmit einem Authentifizierungstoken in die Befehlszeile:

curl -X GET -H "Authorization: Token wef4fwef54te4t5teerdfgghrtgdg53" http://testsite/api/ | python -mjson.tool

Wenn der JSON direkt von einer http-API kommen soll, ist dies auch ein nettes Tool, das in Python implementiert ist: github.com/jkbr/httpie
Florian

Wenn Sie einen Knoten installiert haben (und die Ausgabe im YAML-Stil nicht stört ), gibt es auch dieses Paket: rafeca.com/prettyjson, damit Sie eine Locke mit| prettyjson
Iolo

3
Wie oben erwähnt, besteht eines der Probleme mit python -mjson.tool als JSON- Pretty -Drucker darin, dass JSON nicht immer ausgegeben wird. Zum Beispiel wird 1e1000 zu Infinity (ob mit Python 2.x oder 3.x). 'jq.' erzeugt immer JSON, garantiert jedoch nicht, dass sehr große (oder sehr kleine) Werte genau erhalten bleiben.
Peak

88

Dank der sehr hilfreichen Hinweise von JF Sebastian ist hier ein leicht verbessertes Skript, das ich mir ausgedacht habe:

#!/usr/bin/python

"""
Convert JSON data to human-readable form.

Usage:
  prettyJSON.py inputFile [outputFile]
"""

import sys
import simplejson as json


def main(args):
    try:
        if args[1] == '-':
            inputFile = sys.stdin
        else:
            inputFile = open(args[1])
        input = json.load(inputFile)
        inputFile.close()
    except IndexError:
        usage()
        return False
    if len(args) < 3:
        print json.dumps(input, sort_keys = False, indent = 4)
    else:
        outputFile = open(args[2], "w")
        json.dump(input, outputFile, sort_keys = False, indent = 4)
        outputFile.close()
    return True


def usage():
    print __doc__


if __name__ == "__main__":
    sys.exit(not main(sys.argv))

3
Wenn die Werte in das Wörterbuch geladen werden, geht die Reihenfolge verloren: Normale dictObjekte haben keine definierte Reihenfolge. Versuchen Sie es json.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False)und Sie werden feststellen, dass sie trotzdem getauscht sind. Um dies zu beheben, importieren OrderedDictund loadübergeben object_pairs_hook=OrderedDict.
icktoofay

Sie können das Skript ändern von der Standardeingabe mit dieser zu lesen: inputFile = sys.stdin. Auf diese Weise können Sie Inhalte wie folgt an das Skript weiterleiten:curl http://somewhere.com/foo.json | pp_json.py
Gabe Johnson,

1
Und um zu vermeiden, dass mit dem Kommentar von @ icktoofay sortiert wird, importieren Sie OrderedDict wie folgt : from collections import OrderedDict.
Hugo

2
Danke @icktoofay. Dadurch konnte ich die folgende vim-Funktion erstellen: com! FormatJSON %!python -c "from collections import OrderedDict; import sys; import json; j = json.load(sys.stdin, object_pairs_hook=OrderedDict); json.dump(j, sys.stdout, sort_keys=False, indent=4, separators=(',', ': '))" Beachten Sie, dass die Trennzeichen auf (',', ':') gesetzt werden müssen, um zu vermeiden, dass nachgestellte Leerzeichen hinzugefügt werden: bugs.python.org/issue16333
blindsnowmobile

Toller Ausschnitt! Ich habe sort_keys = Truestattdessen verwendet, weil ich dies verwenden möchte, um JSON-Dateien zu vergleichen, und es funktioniert wie ein Zauber.
JL Peyret

81

Wenn Sie npm und Node.js verwenden, können Sie npm install -g jsonden Befehl ausführen und dann weiterleiten json. Tun Sie json -h, um alle Optionen zu erhalten. Es kann auch bestimmte Felder herausziehen und die Ausgabe mit kolorieren -i.

curl -s http://search.twitter.com/search.json?q=node.js | json

79

Mit den jq-Tools ist es auf native Weise nicht allzu einfach .

Zum Beispiel:

cat xxx | jq .

7
WARNUNG: jq codiert Zahlen als IEEE 754 64-Bit-Floats, und daher wird sich ihre Darstellung wahrscheinlich ändern. Die Genauigkeit sehr kleiner und sehr großer Zahlen geht wahrscheinlich verloren. Versuchen Sie diesen Wert: 1e1000, um zu überprüfen, ob Ihr Lieblingsdrucker das gleiche Problem hat.
Höhepunkt

5
oder einfach : jq . file.json; aber auch cat file.json | jq(ohne Filter .) funktioniert auch. (auf Ubuntu / Linux; Ymmv über Plattformen)
Michael

73

Verwenden Sie mit Perl das CPAN-Modul JSON::XS . Es installiert ein Befehlszeilentool json_xs.

Bestätigen:

json_xs -t null < myfile.json

Verschönern Sie die JSON-Datei src.jsonmitpretty.json :

< src.json json_xs > pretty.json

Wenn Sie nicht haben json_xs, versuchen Sie es json_pp. "pp" steht für "pure perl" - das Tool ist nur in Perl implementiert, ohne an eine externe C-Bibliothek gebunden zu sein (wofür XS steht, Perls "Extension System").


9
Scheint Standard bei Cygwin zu sein!
Janus Troelsen

12
json_pp kann auf die gleiche Weise verwendet werden und ist höchstwahrscheinlich leicht auf Ihrem System zu installieren (unter Debian im 'perl'-Paket).
MichielB

8
Zu Ihrer Information, auf meinem Mac OS X 10.9-System ist json_pp automatisch verfügbar.
Gregg Williams

-t nullgab mir null: kein gültiges toformat ... aber es wegzulassen hat hervorragend funktioniert. Vielen Dank.
Lucas

pp ist für reines Perl, hier nicht schön drucken :) Da json_xs und json_pp mehr können als nur hübsches Drucken und auch mit -json_opt andere Dinge tun als hübsches Drucken. Obwohl hübsches Drucken das Standardverhalten ist.
Kjetil S.

70

Unter * nix funktioniert das Lesen von stdin und das Schreiben in stdout besser:

#!/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)

Fügen Sie dies in eine Datei (ich habe meine nach der Antwort von AnC " prettyJSON " genannt) in Ihren PATH und chmod +xes ein, und Sie können loslegen .


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

3
Verwenden Sie für Programme, die eine benannte Datei erwarten, / dev / stdin, ditto for out und err.
Dvogel

4
Zu Ihrer Information fileinput.input()liest aus stdin, wenn in einer Befehlszeile keine Dateien angegeben sind. Beispiel
jfs

fileinput.input () kann mit Dateien ohne Zeilenumbruch am Ende nicht gut umgehen, als ich das letzte Mal nachgesehen habe.
Zachary Vance

er fragt in Shell-Skript, nicht Python andere Sprache. Mit JQ geht das perfekt.
Bui Anh Tuan

65

Der JSON Ruby Gem wird 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


6
Beachten Sie, dass diese Lösung die Unicode-Escape-Sequenzen "\ uxxxx" dekodiert, im Gegensatz zu der Python-Sequenz mit json.tool. Es scheint jedoch auch Einschränkungen hinsichtlich der Verschachtelungstiefe zu geben ( nesting of 20 is too deep (JSON::NestingError)).
a3nm

2
auf Ubuntu können Sie tun: sudo apt-get install ruby-json-pureanstelle vongem install
Janus Troelsen

1
`` `eric-mbp: ~ ericstob $ sudo gem install json Passwort: Abrufen: json-1.7.3.gem (100%) Erstellen nativer Erweiterungen. Dies kann eine Weile dauern ... Erfolgreich installiertes json-1.7.3 1 gem installiert Installieren der ri-Dokumentation für json-1.7.3 ... Installieren der RDoc-Dokumentation für json-1.7.3 ... eric-mbp: ~ ericstob $ prettify_json .rb -bash: prettify_json.rb: Befehl nicht gefunden
Eric Hartford

Vielleicht könntest du den Inhalt von dir posten prettify_json.rb?
Andrew

Sie können das Skript herunterladen, in Ihren ~/binOrdner verschieben (stellen Sie sicher, dass es sich in Ihrem Pfad befindet), umbenennen prettify_json.rbin ppjund ausführen chmod +x ppj. Jetzt können Sie so etwas wiecurl www.jsonsring.com/something.json | ppj
Uri

58

UPDATE Ich verwende jqjetzt wie in einer anderen Antwort vorgeschlagen. Es ist extrem leistungsfähig beim Filtern von JSON, aber im Grunde genommen auch eine großartige Möglichkeit, JSON zum Anzeigen hübsch zu drucken.

jsonpp ist ein sehr schöner Befehlszeilen-JSON-Drucker.

Aus der README:

Hübsche 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 unter Mac OS X arbeiten, können Sie brew install jsonpp. Wenn nicht, können Sie die Binärdatei einfach an eine beliebige Stelle in Ihrem kopieren $PATH.


1
Ich habe versucht, jsonpp (in der Vergangenheit erfolgreich verwendet) gegen eine riesige Datei (> 60 MB). Ich habe es nach 5 Minuten gestoppt. Ich leitete es in python -mjson.tool(von anderen Antworten hier) und es dauerte 10-20 Sekunden ...
volker

60 MB JSON? Beeindruckend! Ich beschäftige mich normalerweise nicht mit so großen, aber nützlichen Dateien. Vielen Dank.
Jordanelver

Auf meiner Ubuntu-Box habe ich ein json_pp- das json gut formatiert, obwohl ich trotz der Ähnlichkeit bei der Benennung glaube, dass dies ein ganz anderes Projekt ist als das jsonpphier erwähnte
davidpricedev

56

So mach ich es:

curl yourUri | json_pp

Es verkürzt den Code und erledigt die Arbeit.


3
Ubuntu-Server: Wenn Sie Produktionsmaschinen mit sehr eingeschränkten Installationen haben, ist dies möglicherweise die beste Wahl, da diese standardmäßig unter einem bestimmten Namen installiert werden. Python wird je nach Version häufig auf unterschiedliche Weise installiert (z. B. Python3, Python oder gar nicht).
Jonathanjo

55

Ein einfaches Bash-Skript für den hübschen JSON-Druck

json_pretty.sh

#/bin/bash

grep -Eo '"[^"]*" *(: *([0-9]*|"[^"]*")[^{}\["]*|,)?|[^"\]\[\}\{]*|\{|\},?|\[|\],?|[0-9 ]*,?' | awk '{if ($0 ~ /^[}\]]/ ) offset-=4; printf "%*c%s\n", offset, " ", $0; if ($0 ~ /^[{\[]/) offset+=4}'

Beispiel:

cat file.json | json_pretty.sh

1
Danke für die Rückmeldung. Ich habe dieses Skript heute nur für den persönlichen Gebrauch geschrieben und es hat in meinen Fällen gut funktioniert. Ich habe Korrekturen vorgenommen, jetzt ist es kleiner und ohne dieses Problem. Es gibt kein Ziel, das Format vollständig zu unterstützen, aber ich kann bei Bedarf andere Korrekturen vornehmen.
Evgeny Karpov

2
Das ist nur eine funktionierende Antwort, die ich gefunden habe. Ich habe einen Embedded Linux - keinen rubby, keinen Javascript, keinen Zugang zum Internet - Download Python - Modulen ... Ich habe etwas andere awk , die nicht unterstützt %*cNotation so dass ich das geändert printfzu c=0; while (c++<offset) printf " "; printf $0;. Und mein awk hat andere Regex-Flucht und Backslash funktioniert nicht in []. Ich habe die regulären Ausdrücke in /^[[{]/und geändert /[]}]/.
Zaboj Campula

2
Dies sollte akzeptiert werden, da es vollständig nativ ist und keine Software von Drittanbietern erfordert ...
Blag

1
@ EvgenyKarpov schöner Fang, keine Notwendigkeit für einen vollständigen Rollback, nur der grep, der versehentlich gelöscht wurde;)
Blag

1
Vielen Dank, Alter, ich wollte einen schnellen Weg, um einen 8-MB-Einzeiler-Json in bloßem Bash zu formatieren.
Ahmed M

53

Versuchen Sie es pjson. Es hat Farben!

echo '{"json": "obj"} |  pjson

Installieren Sie es mit pip:

⚡ pip install pjson

Und dann leiten Sie jeden JSON-Inhalt an weiter pjson.


Es erfordert Python-Pip (sudo apt-get install python-pip) und dann (sudo pip install pjson) Der große Vorteil sind Farben!
Kristjan Adojaan

1
Der Nachteil ist, dass es nicht möglich ist, farbige Ausgaben zu erfassen.
Kristjan Adojaan

51
$ 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: Dies ist nicht der richtige Weg.

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

Hinweis 2: Wenn Sie ausführen

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

Das gut lesbare Wort wird verschlüsselt

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

Wenn der Rest Ihrer Pipeline ordnungsgemäß mit Unicode umgehen kann und Sie möchten, dass Ihr JSON auch für Menschen geeignet ist , verwenden Sie ihn einfach 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 du wirst bekommen:

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

Eigentlich mache ich das gleiche aber mit Javascript selbst :)
Robert Gould

2
In der Version des JSON-Moduls, die ich habe, to_jsonscheint es keine Optionen zu akzeptieren. Aber das funktioniert:perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
Rörd

Das Python-Beispiel könnte vereinfacht werden. Es ist viel einfacher, JSON-Ausgaben direkt in Pipe zu leiten python -m json.tool.
Dan Loewenherz

@ Dan: ja. Und es gibt mehrere Antworten, die json.toolCodebeispiele zeigen . 1. Mit dieser Version können Sie einige Parameter ändern, z. B. indent2. Zum Zeitpunkt der Veröffentlichung (2008) wurde noch Python 2.4 verwendet , das nicht unterstützt wird-mjson.tool
jfs

40

Ich benutze jshon , um genau das zu tun, was Sie beschreiben. Renn einfach:

echo $COMPACTED_JSON_TEXT | jshon

Sie können auch Argumente übergeben, um die JSON-Daten zu transformieren.


Danke, jshon ist viel schneller als Python oder Ruby für dieselbe Aufgabe zu verwenden
Alexander

2
@Alexander - Wie schnell brauchen Sie einen hübschen Drucker? Ich bin auf OSx Lion, auf dem Python vorinstalliert ist. Mit python -mjson.tool kann ich eine 96-KB-Json-Datei in 0,1 Sekunden hübsch drucken - die JSON-Ausgabe von Earthporn, mit der Jshon verknüpft ist, beträgt ungefähr 24 KB, und ich kann sie in 0,08 Sekunden hübsch drucken. Wie viel schneller ist jshon für dich?
Joensson

1
Ich arbeite mit komprimierten JSON-Datendateien mit 1 + GB (wer weiß sogar, wie groß unkomprimiert ist), daher schätze ich den Vorschlag, dass jshon schneller ist, sehr.
Ryan Ballantyne

38

Oder mit Ruby:

echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'

Das gibt mir einen Fehler. Benötigen Sie ein Ruby JSON-Paket installiert?
mjs

3
Ja, Sie benötigen die JSON Ruby Gem:
Sudo

@MatSchaffer Beachten Sie, dass dies nicht funktioniert, wenn Sie JSON zum Serialisieren von Objekten mit benutzerdefinierten to_jsonMethoden verwenden. Kernel#jjdruckt nur Arrays und Hashes derselben (oder Zahlen / Strings / Boolesche Werte) hübsch aus.
Phrogz

Versuchen Sie unter Windows echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
Folgendes

36

Schauen Sie sich Jazor an . Es ist ein einfacher Befehlszeilen-JSON-Parser, der in Ruby geschrieben wurde.

gem install jazor
jazor --help

4
Ist es nur ich oder ist dies der einzige Vorschlag, der die Frage des OP tatsächlich beantwortet? Ich bin hierher gekommen, um nach einem einfachen Befehl zu suchen, in den ich die Ausgabe leiten kann, curlund dies ist der einzige, der dies für mich getan hat.
Leo Cassarani

2
Mir gefällt, dass es die Möglichkeit gibt, die Ausgabe einzufärben. Erleichtert das Lesen.
Andrew

ooh Ich mag auch die Option, eine URL zu übergeben, da ich diese verwende, um die Ausgabe meiner REST-API anzuzeigen
Andrew

35

Mit diesem einfachen Befehl können Sie das Ergebnis erzielen:

echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool

Beste Antwort meiner Meinung nach. Klein und leicht zu merken und erfordert keine Installation von nicht standardmäßigen Werkzeugen.
Eugene C

python -m json.tool scheint die Reihenfolge des JSON-Objekts nicht beizubehalten.
pushNpop

31

JSONLint verfügt über eine Open-Source-Implementierung auf GitHub , die in der Befehlszeile verwendet oder in ein Node.js-Projekt aufgenommen werden kann.

npm install jsonlint -g

und dann

jsonlint -p myfile.json

oder

curl -s "http://api.twitter.com/1/users/show/user.json" | jsonlint | less

28

Leiten Sie den Ausgang einfach an jq . .

Beispiel:

twurl -H ads-api.twitter.com '.......' | jq .

Schöne Antwort @Ackshaey Singh und man kann das gleiche auch einfach auf eine Datei umleiten. zBcat <file_name.txt> | jq . > <output_name.txt>
Pramit

9
brew install jqWenn Sie auf Mac OS sind.
Distwo

1
Leider hat die Verwendung jq .für das hübsche Drucken einen möglichen Nachteil: Alle vorhandenen Versionen von jq bestehen darauf, JSON-Zahlen als IEEE-Zahlen zu behandeln, sodass die Genauigkeit leicht verloren geht, z. B. bei sehr großen Ganzzahlen.
Peak

2
@Pramit cat file |ist immer eine Verschwendung eines Prozesses; einfach machen jq . <file_name.txt >output_name.txt(mit Literal <und >Zeichen).
Mark Reed

24

Pygementize

Ich kombiniere Pythons json.tool mit pygementize:

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

Es gibt einige Alternativen zu pygementize, die in meiner Antwort aufgeführt sind .

Hier ist eine Live-Demo:

Demo


5
Manchmal muss man verwenden pygmentize -l json, um eine Färbung zu erhalten.
JP

Installieren Sie mit apt - Paket python-pygments, das heißtapt-get install python-pygments
Januar

23

Wenn Sie mit Perl JSON :: PP von CPAN installieren, erhalten Sie den Befehl json_pp . Wenn Sie das Beispiel von B Bycroft stehlen, erhalten Sie:

[pdurbin@beamish ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

Erwähnenswert ist, dass json_ppUbuntu 12.04 (mindestens) und Debian in vorinstalliert sind/usr/bin/json_pp


19

Ich empfehle die Verwendung des Befehlszeilenprogramms json_xs, das im Perlmodul JSON :: XS enthalten ist. JSON :: XS ist ein Perl-Modul zum Serialisieren / Deserialisieren von JSON. Auf einem Debian- oder Ubuntu-Computer können Sie es folgendermaßen installieren:

sudo apt-get install libjson-xs-perl

Es ist offensichtlich auch auf CPAN verfügbar .

Um JSON zu formatieren, das von einer URL erhalten wurde, können Sie curl oder wget wie folgt verwenden:

$ curl -s http://page.that.serves.json.com/json/ | json_xs

oder dieses:

$ wget -q -O - http://page.that.serves.json.com/json/ | json_xs

und um JSON zu formatieren, das in einer Datei enthalten ist, können Sie Folgendes tun:

$ json_xs < file-full-of.json

Um als YAML neu zu formatieren , was einige Leute für besser lesbar halten als JSON:

$ json_xs -t yaml < file-full-of.json

19

Sie können einfach Standardwerkzeuge wie jq oder json_pp verwenden.

echo '{ "foo": "lorem", "bar": "ipsum" }' | json_pp

oder

echo '{ "foo": "lorem", "bar": "ipsum" }' | jq

beide verschönern die Ausgabe wie folgt (jq noch bunter):

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

Der große Vorteil von jq ist, dass es VIEL mehr kann, wenn Sie den json analysieren und verarbeiten möchten.


json_pp war auf meinem Mac - aber nicht jq. Vielen Dank!
David H


Vielen Dank! Hatte noch nie von jq gehört.
David H

17

jj ist superschnell, kann gigantische JSON-Dokumente wirtschaftlich verarbeiten, spielt nicht mit gültigen JSON-Nummern und ist einfach zu verwenden, z

jj -p # for reading from STDIN

oder

jj -p -i input.json

Es ist (2018) noch ziemlich neu, daher wird ungültiges JSON möglicherweise nicht wie erwartet behandelt, aber es ist einfach auf wichtigen Plattformen zu installieren.



16

bat ist ein cat Klon mit Syntaxhervorhebung:

Beispiel:

echo '{"bignum":1e1000}' | bat -p -l json

-pwird ohne Überschriften ausgegeben und -lgibt die Sprache explizit an.

Es hat Farben und Formatierungen für JSON und weist nicht die in diesem Kommentar genannten Probleme auf: Wie kann ich JSON in einem Shell-Skript hübsch drucken?


12

Installieren Sie yajl-tools mit dem folgenden Befehl:

sudo apt-get install yajl-tools

dann,

echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat


Genial. Benötigt keine andere Sprache / Dolmetscher und ist im Paket Repo, keine Notwendigkeit zu brauen!
Joseph Lust
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.