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




print structure (25)

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

Answers

Der JSON Ruby Gem wird mit einem Shellskript gebündelt, um JSON zu verbessern:

sudo gem install json
echo '{ "foo": "bar" }' | prettify_json.rb

gist.github.com/3738968 : gist.github.com/3738968


Es ist nicht zu einfach, auf eine native Weise mit den jq-Tools .

Zum Beispiel:

cat xxx | jq .

Oder mit Ruby:

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

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

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

Bestätigen:

json_xs -t null < myfile.json

Vervollständigen Sie die JSON-Datei src.json mit pretty.json :

< src.json json_xs > pretty.json

Wenn Sie json_xs nicht haben, versuchen Sie es mit 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").


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.


Ich benutze das "space" -Argument 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 Unix-Befehlszeile mit nodejs 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 aus vier Leerzeichen:

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

Mit einer Pfeife:

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));\
 });\
"

jj ist superschnell, kann ginormous JSON-Dokumente kostengünstig verarbeiten, verwendet keine 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 recht neu, daher wird es möglicherweise nicht mit ungültigen JSONs wie erwartet umgehen, aber es ist einfach auf großen Plattformen zu installieren.


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.


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:


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 von einer Internetquelle wie einer API stammt, können Sie verwenden

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

In allen diesen Fällen können Sie einen Alias ​​verwenden:

alias prettyjson='python -m json.tool'

Für noch mehr Komfort mit etwas mehr Tippen, um es vorzubereiten:

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 jedes Mal in der Shell verfügbar sein. prettyjson_s '{"foo": "lorem", "bar": "ipsum"}' es wie prettyjson_s '{"foo": "lorem", "bar": "ipsum"}' .


Wenn Sie npm und Node.js verwenden, können Sie npm install -g json und dann den Befehl über json . Machen Sie json -h , um alle Optionen zu erhalten. Es kann auch bestimmte Felder herausziehen und die Ausgabe mit -i .

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

Versuchen Sie es mit pjson . Es hat Farben!

Installiere es mit pip :

⚡ pip install pjson

Und dann den JSON-Inhalt an pjson .


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

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 .


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

Installieren Sie yajl-tools mit dem folgenden Befehl:

sudo apt-get install yajl-tools

dann,

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


Schauen Sie sich Jazor . Es ist ein einfacher, in Ruby geschriebener JSON-Parser.

curl yourUri | json_pp

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

[[email protected] ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

Es ist erwähnenswert, dass json_pp mit Ubuntu 12.04 (mindestens) und Debian in /usr/bin/json_pp


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
 }

Ich verwende 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 umzuwandeln.


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

Die PHP-Version, wenn Sie PHP> = 5.4 haben.

alias prettify_json=php -E '$o = json_decode($argn); print json_encode($o, JSON_PRETTY_PRINT);'
echo '{"a":1,"b":2}' | prettify_json

Ich mache normalerweise nur:

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

Und um ausgewählte Daten abzurufen (in diesem Fall den Wert "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 mit curl in der Befehlszeile mit einem Authentifizierungstoken tun möchten:

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

Folgendes habe ich in der Google Firebase-Dokumentation gefunden, in der Sie Kommentare in JSON einfügen können:

{
  "//": "Some browsers will use this to enable push notifications.",
  "//": "It is the same for all projects, this is not your project's sender ID",
  "gcm_sender_id": "1234567890"
}




json unix command-line format pretty-print