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

104voto

isaacs Punkte 16053

Wenn Sie npm und Node.js verwenden, können Sie Folgendes tun npm install -g json und leiten Sie dann den Befehl durch json . Do json -h um alle Optionen zu erhalten. Es können auch bestimmte Felder herausgezogen und die Ausgabe eingefärbt werden mit -i .

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

99voto

Olexandr Minzak Punkte 116

Es ist nicht allzu einfach mit einem einheimischen Weg mit die jq-Werkzeuge .

Zum Beispiel:

cat xxx | jq .

7 Stimmen

WARNUNG: jq kodiert Zahlen als IEEE 754 64-Bit-Fließkommazahlen, so dass sich ihre Darstellung ändern kann. Die Genauigkeit von sehr kleinen und sehr großen Zahlen wird wahrscheinlich verloren gehen. Um zu prüfen, ob Ihr bevorzugter Pretty-Printer das gleiche Problem hat, probieren Sie diesen Wert aus: 1e1000.

5 Stimmen

Oder einfach: jq . file.json ; aber auch cat file.json | jq (ohne den Filter . ) funktioniert auch. (auf ubuntu/linux; ymmv über Plattformen)

95voto

Dank J.F. Sebastians sehr hilfreichen Hinweisen habe ich mir ein leicht verbessertes Skript ausgedacht:

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

Wenn die Werte in das Wörterbuch geladen werden, geht die Reihenfolge verloren: normal dict Objekte haben keine festgelegte Reihenfolge. Versuchen Sie json.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False) und Sie werden feststellen, dass sie sowieso vertauscht werden. Um dies zu beheben, importieren Sie OrderedDict y load vorbei an object_pairs_hook=OrderedDict .

0 Stimmen

Sie können das Skript so ändern, dass es von der Standardeingabe liest: inputFile = sys.stdin . Auf diese Weise können Sie das Skript wie folgt weiterleiten: curl http://somewhere.com/foo.json | pp_json.py

1 Stimmen

Und um das Sortieren mit @icktoofay's Kommentar zu vermeiden, importieren Sie OrderedDict wie folgt: from collections import OrderedDict .

85voto

Evgeny Karpov Punkte 2250

Ein einfaches Bash-Skript für 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}'

cat file.json | json_pretty.sh

1 Stimmen

Vielen Dank für das Feedback. Ich habe dieses Skript gerade heute 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 ist nicht das Ziel, das Format vollständig zu unterstützen, aber ich kann andere Korrekturen vornehmen, wenn nötig.

7 Stimmen

Das ist die einzige funktionierende Antwort, die ich gefunden habe. Ich habe ein eingebettetes Linux - kein Rubby, kein Javascript, keinen Zugang zum Internet, um Python-Module herunterzuladen... Ich habe ein etwas anderes awk, das nicht unterstützt %*c Notation, also habe ich die printf a c=0; while (c++<offset) printf " "; printf $0; . Und mein awk hat verschiedene Regex-Escaping und Backslash funktioniert nicht in [] . Ich änderte die Regexe in /^[[{]/ y /[]}]/ .

6 Stimmen

Dies sollte akzeptiert werden, da es vollständig nativ ist und keine Software von Drittanbietern benötigt...

77voto

knb Punkte 8822

Bei Perl verwenden Sie das CPAN-Modul JSON::XS . Es installiert ein Kommandozeilen-Tool json_xs .

Bestätigen:

json_xs -t null < myfile.json

Aufhübschen der JSON-Datei src.json a pretty.json :

< src.json json_xs > pretty.json

Wenn Sie nicht über json_xs , versuchen json_pp . "pp" steht für "pure perl" - das Tool ist ausschließlich in Perl implementiert, ohne Bindung an eine externe C-Bibliothek (wofür XS steht, das "Extension System" von Perl).

9 Stimmen

Scheint bei Cygwin Standard zu sein!

15 Stimmen

Json_pp kann auf die gleiche Weise verwendet werden und ist höchstwahrscheinlich bereits auf Ihrem System installiert (unter Debian befindet es sich im 'perl'-Paket).

8 Stimmen

Zu Ihrer Information: Auf meinem Mac OS X 10.9 System ist json_pp automatisch verfügbar.

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