Hoe kan ik MOOI-print JSON in een Shell-script?

Is er een (UNIX) Shell-script om JSON in menselijk leesbaar formulier te formatteren?

In principe wil ik het om het volgende transformeren:

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

… in zoiets:

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

Antwoord 1, Autoriteit 100%

Met Python 2.6+ kunt u doen:

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

of, als de JSON in een bestand staat, kunt u doen:

python -m json.tool my_json.json

Als de JSON vanaf een internetbron is, zoals een API, kunt u

gebruiken

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

Voor het gemak in al deze gevallen kunt u een alias maken:

alias prettyjson='python -m json.tool'

Voor nog meer gemak met een beetje meer typen om het klaar te maken:

prettyjson_s() {
    echo "$1" | python -m json.tool
}
prettyjson_f() {
    python -m json.tool "$1"
}
prettyjson_w() {
    curl "$1" | python -m json.tool
}

voor alle bovengenoemde gevallen. U kunt dit in .bashrcplaatsen en het zal elke keer in de schaal beschikbaar zijn. Roepen het op als prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'.

Merk op dat, zoals @pnd in de opmerkingen hieronder aangaf, in Python 3.5+ het JSON-object niet langer standaard wordt gesorteerd. Om te sorteren, voegt u de vlag --sort-keystoe aan het einde. D.w.z. ... | python -m json.tool --sort-keys.


Antwoord 2, autoriteit 26%

U kunt gebruiken: jq

Het is heel eenvoudig te gebruiken en het werkt geweldig! Het kan zeer grote JSON-structuren aan, inclusief streams. Je kunt vinden
hun tutorials hier.

Gebruiksvoorbeelden:

$ jq --color-output . file1.json file1.json | less -R
$ command_with_json_output | jq .
$ jq # stdin/"interactive" mode, just enter some JSON
$ jq <<< '{ "foo": "lorem", "bar": "ipsum" }'
{
  "bar": "ipsum",
  "foo": "lorem"
}

Of gebruik jqmet identiteitsfilter:

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

Antwoord 3, autoriteit 8%

Ik gebruik het argument “space” van JSON.stringifyom JSON mooi af te drukken in JavaScript.

Voorbeelden:

// Indent with 4 spaces
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, 4);
// Indent with tabs
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, '\t');

Vanaf de Unix-opdrachtregel met Node.js, JSON specificeren op de opdrachtregel:

$ node -e "console.log(JSON.stringify(JSON.parse(process.argv[1]), null, '\t'));" \
  '{"foo":"lorem","bar":"ipsum"}'

Retouren:

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

Vanaf de opdrachtregel van UNIX met Node.js, met het opgeven van een bestandsnaam die JSON bevat en een streepje van vier spaties bevat:

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

Een pijp gebruiken:

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

Antwoord 4, Autoriteit 7%

Ik heb een tool geschreven met een van de beste “Smart WhiteSpace” -formulieren beschikbaar. Het produceert meer leesbare en minder uitgebreide output dan de meeste andere opties hier.

underscore-cli

Dit is wat “Smart WhiteSpace” eruit ziet:

Ik ben misschien een beetje bevooroordeeld, maar het is een geweldig hulpmiddel voor het afdrukken en manipuleren van JSON-gegevens van de opdrachtregel. Het is supervriendelijk om te gebruiken en heeft uitgebreide opdrachtregelhulp / documentatie. Het is een Zwitsers Mes Mes dat ik gebruik voor 1001 verschillende kleine taken die verrassend irritant zijn om een ​​andere manier te doen.

Laatste gebruiksvoorbeeld: Chrome, Dev-console, tabblad Netwerk, alles exporteren als HAR-bestand, “cat site.har | underscore select ‘.url’ –outfmt text | grep mydomain”; nu heb ik een chronologisch geordende lijst van alle URL-ophaalacties die zijn gedaan tijdens het laden van de site van mijn bedrijf.

Mooi printen is eenvoudig:

underscore -i data.json print

Hetzelfde:

cat data.json | underscore print

Hetzelfde, explicieter:

cat data.json | underscore print --outfmt pretty

Deze tool is mijn huidige passieproject, dus als je functieverzoeken hebt, is de kans groot dat ik ze zal behandelen.


Antwoord 5, autoriteit 4%

Ik doe meestal gewoon:

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

En om geselecteerde gegevens op te halen (in dit geval de waarde van ‘test’):

echo '{"test":1,"test2":2}' | python -c 'import sys,json;data=json.loads(sys.stdin.read()); print data["test"]'

Als de JSON-gegevens in een bestand staan:

python -mjson.tool filename.json

Als je het allemaal in één keer wilt doen met curlop de opdrachtregel met een authenticatietoken:

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

Antwoord 6, autoriteit 2%

Dankzij de zeer nuttige tips van J.F. Sebastian is hier een enigszins verbeterd script dat ik heb bedacht:

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

Antwoord 7, autoriteit 2%

Als je npm en Node.js gebruikt, kun je npm install -g jsondoen en het commando vervolgens door jsonsturen. Gebruik json -hom alle opties te krijgen. Het kan ook specifieke velden eruit halen en de uitvoer inkleuren met -i.

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

Antwoord 8, autoriteit 2%

Het is niet zo eenvoudig met een native manier met de jq-tools.

Bijvoorbeeld:

cat xxx | jq .

Antwoord 9, autoriteit 2%

Gebruik bij Perl de CPAN-module JSON::XS. Het installeert een opdrachtregelprogramma json_xs.

Valideren:

json_xs -t null < myfile.json

Maak het JSON-bestand src.jsonmooier tot pretty.json:

< src.json json_xs > pretty.json

Als je json_xsniet hebt, probeer dan json_pp. “pp” staat voor “pure perl” – de tool is alleen geïmplementeerd in Perl, zonder binding aan een externe C-bibliotheek (waar XS voor staat, Perl’s “Extension System”).


Antwoord 10, autoriteit 2%

Op *nix werkt het lezen van stdin en schrijven naar stdout beter:

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

Zet dit in een bestand (ik noemde de mijne “prettyJSON” naar AnC‘s antwoord) in je PATH en chmod +xit, en je bent klaar om te gaan.


Antwoord 11

een eenvoudig bash-script voor mooie json-afdrukken

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

Voorbeeld:

cat file.json | json_pretty.sh

Antwoord 12

De JSON Ruby Gem is gebundeld met een shellscript om JSON mooier te maken:

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

Script Download: Gist.github.com/3738968


Antwoord 13

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

Opmerking: het is niet de manier om het te doen.

hetzelfde in PERL:

$ cat json.txt \
> | perl -0007 -MJSON -nE'say to_json(from_json($_, {allow_nonref=>1}), 
>                                     {pretty=>1})'
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

Opmerking 2:
Als u

uitvoert

echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
| python -c'import fileinput, json;
print(json.dumps(json.loads("".join(fileinput.input())),
                 sort_keys=True, indent=4))'

Het mooi leesbare woord wordt \ u gecodeerd

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

Als de rest van uw pijplijn de Unicode ingrijpen en u wilt dat uw JSON ook mensvriendelijk is, gewoon Gebruik 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)'

en je krijgt:

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

Antwoord 14

UPDATEIk gebruik nu jqzoals gesuggereerd in een ander antwoord. Het is extreem krachtig in het filteren van JSON, maar, in zijn meest elementaire vorm, ook een geweldige manier om JSON mooi af te drukken om te bekijken.

jsonppis een erg mooie command line JSON mooie printer.

Van de README:

Vrij afgedrukte webservicereacties als volgt:

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

en maak de bestanden die op je schijf rondlopen mooi:

jsonpp data/long_malformed.json

Als je Mac OS X gebruikt, kun je brew install jsonpp. Zo niet, dan kun je het binaire bestand eenvoudig ergens in je $PATHkopiëren.


Antwoord 15

Zo doe ik het:

curl yourUri | json_pp

Het verkort de code en klaart de klus.


Antwoord 16

Probeer pjson. Het heeft kleuren!

Installeer het met pip:

⚡ pip install pjson

En pijp vervolgens alle JSON-inhoud naar pjson.


Antwoord 17

Ik gebruik jshon om precies te doen wat u beschrijft. Voer net uit:

echo $COMPACTED_JSON_TEXT | jshon

U kunt ook argumenten doorgeven om de JSON-gegevens te transformeren.


Antwoord 18

U kunt deze eenvoudige opdracht gebruiken om het resultaat te bereiken:

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

Antwoord 19

of, met Ruby:

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

Antwoord 20

Uitchecken jazor . Het is een eenvoudige opdrachtregel Json Parser geschreven in Ruby.

gem install jazor
jazor --help

Antwoord 21

jsonlint heeft een Open-source implementatie op Github die kan worden gebruikt op de opdrachtregel of opgenomen in een Node.js-project.

npm install jsonlint -g

en dan

jsonlint -p myfile.json

of

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

Antwoord 22

Pijp gewoon de uitvoer op jq ..

Voorbeeld:

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

Antwoord 23

U kunt eenvoudig standaardtools zoals JQ of JSON_PP gebruiken.

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

of

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

Zal zowel de uitvoer als het volgende (JQ nog meer kleurrijk):

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

Het enorme voordeel van JQ is dat het veel meer kan doen als u de JSON wilt parseren en verwerken.


Antwoord 24

Met PerL, als u JSON :: pp van CPAN zult doen Download de JSON_PP commando. Stealing the voorbeeld van B Bycroft krijgt u:

[pdurbin@beamish ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

Het is de moeite waard om te vermelden dat json_ppvooraf is geïnstalleerd met Ubuntu 12.04 (tenminste) en Debian in /usr/bin/json_pp


Antwoord 25

Pygering

Ik combineer Python’s JSON.tool met Pyding:

echo '{"foo": "bar"}' | python -m json.tool | pygmentize -g

Er zijn enkele alternatieven voor pygering die worden vermeld in mijn dit antwoord .

Hier is een live demo:


Antwoord 26

Ik raad aan om het json_xs opdrachtregelhulpprogramma te gebruiken dat is opgenomen in de JSON::XS perl-module. JSON::XS is een Perl-module voor het serialiseren/deserialiseren van JSON, op een Debian- of Ubuntu-machine kun je het als volgt installeren:

sudo apt-get install libjson-xs-perl

Het is uiteraard ook beschikbaar op CPAN.

Om het te gebruiken om JSON te formatteren die is verkregen van een URL, kun je curl of wget als volgt gebruiken:

$ curl -s http://page.that.serves.json.com/json/ | json_xs

of dit:

$ wget -q -O - http://page.that.serves.json.com/json/ | json_xs

en om JSON in een bestand te formatteren, kunt u dit doen:

$ json_xs < file-full-of.json

Opnieuw formatteren als YAML, wat volgens sommige mensen menselijker leesbaar is dan JSON :

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

Antwoord 27

jjis supersnel, kan zuinig omgaan met gigantische JSON-documenten, knoeit niet met geldige JSON-nummers , en is gemakkelijk te gebruiken, bijv

jj -p # for reading from STDIN

of

jj -p -i input.json

Het is (2018) nog steeds vrij nieuw, dus misschien behandelt het niet ongeldige JSON zoals u verwacht, maar het is eenvoudig te installeren op grote platforms.


Antwoord 28

batis een catclone with SYNTAX-markering:

Voorbeeld:

echo '{"bignum":1e1000}' | bat -p -l json

-pwordt uitgevoerd zonder headers, en -lgeeft de taal expliciet op.

Het heeft kleuring en opmaak voor JSON en doet niet Heeft u de problemen opgemerkt in deze opmerking: Hoe kan ik Printen JSON in een Shell-script?


Antwoord 29

  1. brew install jq
  2. command + | jq
  3. (Voorbeeld: curl localhost:5000/blocks | jq)
  4. Genieten!


ANTWOORD 30

Installeer Yajl-Tools met de onderstaande opdracht:

sudo apt-get install yajl-tools

Dan,

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

Other episodes