Vraag Hoe kan ik JSON behoorlijk printen in een (Unix) shellscript?


Is er een (Unix) shellscript om JSON in menselijk leesbare vorm op te maken?

Kortom, ik wil dat het het volgende transformeert:

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

... in zoiets als dit:

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

2500


oorsprong


antwoorden:


Met Python 2.6+ kun je gewoon:

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

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

python -m json.tool my_json.json

als de JSON afkomstig is van een internetbron zoals een API, kunt u deze gebruiken

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

Voor het gemak in al deze gevallen kun je 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. Je kunt dit invoegen .bashrc en het zal elke keer in de schaal beschikbaar zijn. Roep het als prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'.


3734



Je kunt gebruiken: jq

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

Hier is een voorbeeld:

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

Of met andere woorden:

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

687



Ik gebruik het argument "space" van JSON.stringify om JSON behoorlijk te printen 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 nodejs, specificeer json op de opdrachtregel:

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

Komt terug:

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

Vanaf de Unix-opdrachtregel met Node.js, met een bestandsnaam die JSON bevat, en met een streepje van vier spaties:

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

358



Ik heb een tool geschreven met een van de beste 'smart whitespace'-formatteerders die beschikbaar is. Het produceert meer leesbare en minder uitgebreide uitvoer dan de meeste andere opties hier.

underscore-cli

Dit is hoe "slimme witruimte" eruitziet:

Ik ben misschien een beetje bevooroordeeld, maar het is een geweldig hulpmiddel voor het afdrukken en manipuleren van JSON-gegevens vanaf de opdrachtregel. Het is supervriendelijk in gebruik en heeft uitgebreide hulp / documentatie voor de commandoregel. Het is een Zwitsers zakmes dat ik gebruik voor 1001 verschillende kleine taken die verrassend vervelend zouden zijn om op een andere manier te doen.

Nieuwste use-case: Chrome, Dev console, tabblad Network, 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 gemaakt tijdens het laden van de website van mijn bedrijf.

Mooi printen is gemakkelijk:

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.


321



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 zich in een bestand bevinden:

python -mjson.tool filename.json

Als je alles tegelijk wilt doen curl op de opdrachtregel met behulp van een verificatietoken:

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

168



Dankzij de zeer nuttige aanwijzingen van J.F. Sebastian, hier is 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))

82



Op * nix werkt 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" na ANC's antwoord) in je PATH en chmod +x het, en je bent klaar om te gaan.


66



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

valideren:

json_xs -t null < myfile.json

Prettify het JSON-bestand src.jsonnaar pretty.json:

< src.json json_xs > pretty.json

Als je het niet hebt json_xs, proberen json_pp . "pp" is voor "pure perl" - de tool is alleen in Perl geïmplementeerd, zonder een binding aan een externe C-bibliotheek (dat is waar XS voor staat, Perls "uitbreidingsysteem").


65



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

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

Scriptdownload: gist.github.com/3738968


63



Als u npm en Node.js gebruikt, kunt u dat doen npm install -g json en voer dan het commando door json. Do json -h om alle opties te krijgen. Het kan ook specifieke velden selecteren en de uitvoer inkleuren met -i.

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

63