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 ^^

5126voto

B Bycroft Punkte 3480

Mit Python 2.6+ können Sie das tun:

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

oder, wenn das JSON in einer Datei ist, können Sie tun:

python -m json.tool my_json.json

wenn das JSON aus einer Internetquelle wie z.B. einer API stammt, können Sie

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

Der Einfachheit halber können Sie in all diesen Fällen einen Alias erstellen:

alias prettyjson='python -m json.tool'

Für noch mehr Bequemlichkeit mit etwas mehr Tipparbeit, um es fertigzustellen:

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 in .bashrc und es wird jederzeit in der Shell verfügbar sein. Rufen Sie es auf wie prettyjson_s '{"foo": "lorem", "bar": "ipsum"}' .

Beachten Sie, dass das JSON-Objekt in Python 3.5+ nicht mehr standardmäßig sortiert ist, wie @pnd in den Kommentaren unten bemerkte. Um zu sortieren, fügen Sie die --sort-keys Flagge bis zum Ende. D.h. ... | python -m json.tool --sort-keys .

3 Stimmen

Mit anderen Versionen von Python können Sie simplejson installieren und python -msimplejson.tool verwenden

79 Stimmen

Sie könnten das auf pygmentize -l javascript um eine farbige Syntaxausgabe in der Befehlszeile zu erhalten. Modifier : Wenn Sie pygments installiert haben, das heißt.

4 Stimmen

Alias ppj='python -mjson.tool'; echo '{"foo": "lorem", "bar": "ipsum"}' | ppj

1522voto

Vita Pluvia Punkte 470

Sie können verwenden: jq

Es ist sehr einfach zu bedienen und funktioniert hervorragend! Es kann sehr große JSON-Strukturen verarbeiten, einschließlich Streams. Sie finden ihre Anleitungen aquí .

Beispiele für den Gebrauch:

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

Oder verwenden Sie jq mit Identitätsfilter:

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

18 Stimmen

Außerdem gibt es eine --sort-keys was in einigen Fällen hilfreich ist.

0 Stimmen

Jq ist ein großartiges Werkzeug, das ich durch diese Antwort entdeckt habe. Beachten Sie jedoch, dass es ganze Objekte benötigt, um zu arbeiten. Es beginnt erst mit der Ausgabe von Ergebnissen, wenn es das gesamte Eingabeobjekt eingelesen hat.

23 Stimmen

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

411voto

Somu Punkte 3393

Ich verwende das Argument "Leerzeichen" von JSON.stringify zum Pretty-Printing von JSON in JavaScript.

Beispiele:

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

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

Über die Unix-Befehlszeile mit Node.js, wobei JSON in der Befehlszeile angegeben wird:

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

Rückgabe:

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

Über die Unix-Befehlszeile mit Node.js, unter Angabe eines Dateinamens, der JSON enthält, und unter Verwendung eines Einzugs von vier Leerzeichen:

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

Verwendung eines Rohrs:

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 Stimmen

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

12 Stimmen

Abgelehnt. Im OP geht es um ein "*Nix-Befehlszeilenskript" und diese Antwort steht in einem anderen Zusammenhang.

54 Stimmen

@danorton: JS kann von der Kommandozeile aus über node.js und andere ähnliche Lösungen verwendet werden.

357voto

Dave Dopson Punkte 39640

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

underscore-cli

So sieht "intelligenter Leerraum" aus:

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

Neuester Anwendungsfall: Chrome, Entwicklungskonsole, Registerkarte "Netzwerk", alles als HAR-Datei exportieren, "cat site.har | underscore select '.url' --outfmt text | grep mydomain"; jetzt habe ich eine chronologisch geordnete Liste aller URL-Abrufe, die während des Ladens der Website meines Unternehmens gemacht wurden.

Schönes Drucken ist einfach:

underscore -i data.json print

Das ist dasselbe:

cat data.json | underscore print

Das Gleiche, nur deutlicher:

cat data.json | underscore print --outfmt pretty

Dieses Tool ist mein derzeitiges Lieblingsprojekt. Wenn Sie also Funktionswünsche haben, stehen die Chancen gut, dass ich sie berücksichtigen werde.

4 Stimmen

Ich habe auch mein ~/.bash_profile aktualisiert, um die folgende Zeile zu haben: alias underscor='underscore print --outfmt pretty' jetzt kann ich einfach curl ausführen beispiel.de/ergebnis.json | Unterstrich und trotzdem Unterstrich für andere Formatierungen verwenden

0 Stimmen

Danke, Dave! Tool ist gut! alias pretty-json="underrsore pretty" und curl output erfreuen ein Auge

0 Stimmen

Großartiges Formatierungswerkzeug, nur ein Hinweis: Die Weiterleitung der Ausgabe in eine Datei (entweder mit -o oder mit der Option > ) funktioniert nur mit Unterstrichdruck . Unterstrich hübsch speichert eine Datei mit eingefügten Farbformatierungszeichen oder Ähnlichem: [32m , [33m , [39m zusammen mit einigen nicht druckbaren Zeichen vor jedem von ihnen, was JSON ungültig macht. Allerdings, Unterstrichdruck allein fügt einer Datei nichts hinzu und erfüllt seine Aufgabe der Formatierung perfekt.

185voto

jassinm Punkte 6923

Normalerweise tue ich das einfach:

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

Und zum Abrufen ausgewählter Daten (in diesem Fall der 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 machen wollen mit curl in der Befehlszeile unter Verwendung eines Authentifizierungstokens:

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

0 Stimmen

Wenn das json direkt von einer http api kommen soll, ist dies auch ein nettes Werkzeug, das in Python implementiert ist: github.com/jkbr/httpie

0 Stimmen

Wenn Sie Node installiert haben (und sich nicht an der YAML-Ausgabe stören), gibt es auch dieses Paket: rafeca.com/prettyjson so können Sie eine Locke mit | prettyjson

3 Stimmen

Wie bereits erwähnt, ist eines der Probleme mit python -mjson.tool als JSON-Pretty-Printer ist, dass er nicht immer JSON ausgibt. Z.B. wird 1e1000 zu Infinity (egal ob mit Python 2.x oder 3.x). jq .' erzeugt immer JSON, aber es garantiert nicht, dass sehr große (oder sehr kleine) Werte exakt erhalten bleiben.

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