unix javascript print - Wie kann ich JSON in einem Shellskript hübsch drucken?





15 Answers

Sie können verwenden: jq

Es ist sehr einfach zu bedienen und funktioniert super! Es kann sehr große JSON-Strukturen einschließlich Streams verarbeiten. Die Tutorials finden Sie here .

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"
}
structure html pretty

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

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

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

... in so etwas:

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



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

underscore-cli

So sieht "Smart Whitespace" aus:

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

Neuester Anwendungsfall: Chrome, Dev-Konsole, Registerkarte "Netzwerk", alle als HAR-Datei exportieren, "cat site.har | Unterstrich auswählen" .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.

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 Passionsprojekt. Wenn Sie also Funktionswünsche haben, besteht eine gute Chance, dass ich sie ansprechen werde.




Dank der hilfreichen Hinweise von JF Sebastian, 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))



Auf * nix funktioniert das Lesen von stdin und 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)

Schreibe dies in eine Datei (ich habe nach AnC Antwort "prettyJSON" genannt) in PATH und chmod +x , und du kannst AnC .







UPDATE Ich verwende jq jetzt wie in einer anderen Antwort vorgeschlagen. Es ist extrem leistungsfähig beim Filtern von JSON, aber in seiner einfachsten Form ist es auch eine großartige Möglichkeit, JSON zum Anzeigen schön auszudrucken.

jsonpp ist ein sehr schöner JSON-Drucker mit Befehlszeile.

Aus der README:

Ziemlich gedruckte Webservice-Antworten wie folgt:

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

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

jsonpp data/long_malformed.json

Wenn Sie mit Mac OS X arbeiten, können Sie brew install jsonpp . Wenn nicht, können Sie die Binärdatei einfach irgendwo in Ihren $PATH kopieren.




$ 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 der richtige Weg.

Dasselbe 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 du rennst

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 Unicode ensure_ascii=False verarbeitet und Sie möchten, dass Ihr JSON auch ensure_ascii=False , verwenden Sie 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 bekommst:

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



So mach ich es:

gem install jazor
jazor --help

Es verkürzt den Code und erledigt die Arbeit.




Oder mit Ruby:

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



JSONLint verfügt über eine Open-Source-Implementierung. Github kann in der Befehlszeile oder in einem Projekt "node.js" verwendet werden.

npm install jsonlint -g

und dann

jsonlint -p myfile.json

oder

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



Vanilla Bash

Ein einfaches Bash-Skript ( grep / awk ) für hübschen JSON-Druck ohne Installation durch Dritte:

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

Beispiele:

1) Lesen Sie die Datei und drucken Sie sie in der Konsole aus

cat file.json | json_pretty.sh

2) Verwenden Sie mit Windows GIT Bash von Datei zu Datei (UTF8-basiert):

cat fileIn.json |sh.exe json_pretty.sh > fileOut.json



Ich empfehle die Verwendung des Befehlszeilen-Dienstprogramms json_xs, das im Perl-Modul 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 es zu verwenden, um JSON zu formatieren, das von einer URL abgerufen wird, können Sie curl oder wget folgendermaßen 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

Um JSON in einer Datei zu formatieren, können Sie Folgendes tun:

$ json_xs < file-full-of.json

Um es als YAML zu formatieren, was manche Leute für menschlicher lesbar halten als JSON:

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



Installieren Sie yajl-tools mit dem folgenden Befehl:

sudo apt-get install yajl-tools

dann,

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




yajl ist meiner Erfahrung nach sehr nett. Ich benutze den Befehl json_reformat , um .json Dateien in vim drucken, indem Sie die folgende Zeile in mein .vimrc :

autocmd FileType json setlocal equalprg=json_reformat



Ich verwende httpie

$ pip install httpie

Und du kannst es so benutzen

 $ http PUT localhost:8001/api/v1/ports/my 
 HTTP/1.1 200 OK
 Connection: keep-alive
 Content-Length: 93
 Content-Type: application/json
 Date: Fri, 06 Mar 2015 02:46:41 GMT
 Server: nginx/1.4.6 (Ubuntu)
 X-Powered-By: HHVM/3.5.1

 {
     "data": [], 
     "message": "Failed to manage ports in 'my'. Request body is empty", 
     "success": false
 }



Related