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 .bashrc
plaatsen 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-keys
toe 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 jq
met identiteitsfilter:
$ jq '.foo' <<< '{ "foo": "lorem", "bar": "ipsum" }'
"lorem"
Antwoord 3, autoriteit 8%
Ik gebruik het argument “space” van JSON.stringify
om 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.
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 curl
op 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 json
doen en het commando vervolgens door json
sturen. Gebruik json -h
om 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.json
mooier tot pretty.json
:
< src.json json_xs > pretty.json
Als je json_xs
niet 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 +x
it, 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 jq
zoals 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 $PATH
kopië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_pp
vooraf 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
bat
is een cat
clone with SYNTAX-markering:
Voorbeeld:
echo '{"bignum":1e1000}' | bat -p -l json
-p
wordt uitgevoerd zonder headers, en -l
geeft 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
brew install jq
command + | jq
- (Voorbeeld:
curl localhost:5000/blocks | jq
) - Genieten!
ANTWOORD 30
Installeer Yajl-Tools met de onderstaande opdracht:
sudo apt-get install yajl-tools
Dan,
echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat