Frage Wie kann ich JSON in einem (Unix-) Shell-Skript drucken?


Gibt es ein (Unix-) Shell-Skript, um JSON in lesbarer Form zu formatieren?

Im Grunde möchte ich Folgendes transformieren:

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

... in etwas wie das:

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

2500


Ursprung


Antworten:


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

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

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

python -m json.tool my_json.json

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

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

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

alias prettyjson='python -m json.tool'

Für noch mehr Komfort mit ein wenig mehr Tipparbeit, 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 einstellen .bashrc und es wird jedes Mal in der Schale verfügbar sein. Rufen Sie es so auf prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'.


3734



Sie können verwenden: jq

Es ist sehr einfach zu bedienen und es funktioniert super! Es kann sehr große JSON-Strukturen einschließlich Streams verarbeiten. Sie können finden ihre Tutorials Hier.

Hier ist ein Beispiel:

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

Oder mit anderen Worten:

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

687



Ich benutze das Argument "space" von JSON.stringify um JSON in JavaScript 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 Befehlszeile von Unix mit nodejs json in der Befehlszeile ein:

$ 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 ein, der JSON enthält, und verwenden Sie einen Einzug von 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));\
 });\
"

358



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

Unterstrich-Cli

So sieht "Smart Whitespace" aus:

Ich bin vielleicht etwas 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 umfangreiche Befehlszeilenhilfe / Dokumentation. Es ist ein Schweizer Taschenmesser, das ich für 1001 verschiedene kleine Aufgaben benutze, die auf andere Weise überraschend nervig wären.

Letzter Anwendungsfall: Chrome, Dev-Konsole, Registerkarte Netzwerk, alles als HAR-Datei exportieren, "cat site.har | unterstreichen select '.url' --outfmt text | grep mydomain"; jetzt habe ich eine chronologisch geordnete Liste aller URL-Abrufe, die während des Ladens meiner Firmenseite gemacht wurden.

Hübscher Druck ist einfach:

underscore -i data.json print

Gleiche Sache:

cat data.json | underscore print

Das Gleiche, 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 sie anspreche.


321



Normalerweise mache ich nur:

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

Und um ausgewählte Daten zu erhalten (in diesem Fall "Test" -Wert):

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 mit machen wollen curl in der Befehlszeile mit einem Authentifizierungstoken:

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

168



Danke an J.F. Sebastian's sehr hilfreiche Hinweise, hier ist 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))

82



Auf * 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)

Legen Sie das in eine Datei (ich nannte meine "prettyJSON" danach AnC's Antwort) in Ihrem Pfad und chmod +x es, und du bist gut zu gehen.


66



Mit Perl verwenden Sie das CPAN-Modul JSON::XS. Es installiert ein Befehlszeilenprogramm json_xs.

Bestätigen:

json_xs -t null < myfile.json

Prettify die JSON-Datei src.jsonzu pretty.json:

< src.json json_xs > pretty.json

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


65