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



Answers

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 ihre Tutorials 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"
}
Question

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



So mach ich es:

curl yourUri | json_pp

Es verkürzt den Code und erledigt die Arbeit.




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" nach AnC Antwort) in Ihrem PATH und chmod +x und Sie sind gut zu gehen.




$ 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 Weg, es zu tun.

Das gleiche 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 Sie laufen

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 codiert

{
    "D\u00fcsseldorf": "lorem", 
    "bar": "ipsum"
}

Wenn der Rest Ihrer Pipeline Unicode- ensure_ascii=False 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 wirst bekommen:

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



Dank JF Sebastians sehr nützlichen Hinweisen, 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))



Probiere pjson . Es hat Farben!

Installiere es mit pip :

⚡ pip install pjson

Und dann pipe alle JSON Inhalte zu pjson .




Vanille Bash

Ein einfaches Bash-Skript ( grep / awk ) für den hübschen JSON-Druck, ohne Installation von Drittanbietern:

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 den hübschen Ausdruck in der Konsole

cat file.json | json_pretty.sh

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

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



jq . den Ausgang einfach an jq . .

Beispiel:

twurl -H ads-api.twitter.com '.......' | jq .



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.

underscore-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.




  1. brew install jq
  2. command + | jq
  3. (Beispiel: curl localhost:5000/blocks | jq )
  4. Genießen!




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

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



Ich empfehle die Verwendung des json_xs Befehlszeilendienstprogramms, das im JSON :: XS Perlmodul enthalten ist. JSON :: XS ist ein Perl Modul zum Serialisieren / Deserialisieren von JSON, auf einem Debian oder Ubuntu Rechner können Sie es wie folgt installieren:

sudo apt-get install libjson-xs-perl

Es ist offensichtlich auch auf CPAN verfügbar.

Um es zum Formatieren von JSON zu verwenden, das von einer URL erhalten wurde, können Sie curl oder wget wie folgt 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

und um JSON zu formatieren, das in einer Datei enthalten ist, können Sie dies tun:

$ json_xs < file-full-of.json

Als YAML formatieren, was manche Leute für menschlich lesbarer halten als JSON:

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



Schau Jazor . Es ist ein einfacher JSON-Parser, der in Ruby geschrieben wurde.

gem install jazor
jazor --help



yajl ist sehr schön, nach meiner Erfahrung. Ich verwende seinen json_reformat Befehl, um .json Dateien in vim .json , indem ich die folgende Zeile in meine .vimrc :

autocmd FileType json setlocal equalprg=json_reformat



Ich weiß, dass diese Frage ad nauseam geantwortet hat, aber ich wollte eine Ruby-Lösung dokumentieren, die besser ist als Json's Prettify-Befehl, der Edelstein colorful_json ist ziemlich gut.

gem install colorful_json
echo '{"foo": "lorem", "bar": "ipsum"}' | cjson
{
  "foo": "lorem",
  "bar": "ipsum"
}



Related