Jak mogę ładnie wydrukować JSON w skrypcie powłoki?

3060

Czy istnieje skrypt powłoki (Unix) do formatowania JSON w formie czytelnej dla człowieka?

Zasadniczo chcę, aby przekształcić następujące:

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

... w coś takiego:

{
    "foo": "lorem",
    "bar": "ipsum"
}
AnC
źródło
7
Niedawno zwróciłem swój własny: github.com/exhuma/braindump/tree/master/jsonformat Kod jest bardzo prosty, używając własnej jsonbiblioteki Pythona , ale dodałem również pigmety, aby uzyskać wyróżnianie składni.
ekshuma
Natknąłem się na to, ale potem znalazłem Json Pretty i bardzo mi się podoba. Typekit używa go w przykładach API, więc kryje się za tym klout ^^
Nick Tomlin
Jeśli nie masz nic przeciwko kopiowaniu wklejania, istnieje również kilka prostych narzędzi online, takich jak jsonprettyprint.net, w których możesz szybko wydrukować swój surowy JSON.
Javaaaa
7
Uwaga : python -m json.tool nie zawsze wytwarza poprawny JSON. (Wskazówka: 1e1000)
szczyt

Odpowiedzi:

4459

Dzięki Python 2.6+ możesz po prostu:

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

lub, jeśli JSON znajduje się w pliku, możesz wykonać:

python -m json.tool my_json.json

jeśli JSON pochodzi ze źródła internetowego, takiego jak API, możesz użyć

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

Dla wygody we wszystkich tych przypadkach możesz utworzyć alias:

alias prettyjson='python -m json.tool'

Aby uzyskać jeszcze większą wygodę i nieco więcej pisania, aby się przygotować:

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

prettyjson_f() {
    python -m json.tool "$1"
}

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

dla wszystkich powyższych przypadków. Możesz to włożyć .bashrci będzie ono dostępne za każdym razem w powłoce. Wywołaj to jak prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'.

Campovski
źródło
72
Możesz potokować to, pygmentize -l javascriptaby uzyskać kolorowe wyjście w linii poleceń. Edycja : Jeśli masz już zainstalowane pigwy.
Shrikant Sharat
177
Świetna odpowiedź, tylko ostrożnie mam z nim jest to robi porządek przycisków na wyjściu - co może musisz być świadomy.
Chris Nash,
14
W moim .vimrc "nnoremap <f5>:%! Python -m json.tool <CR>: w <CR>"
imwilsonxu
40
Wydaje się, że ucieka ona od znaków Unicode do \ uXXXX, co może być wadą.
user1071136,
13
Utworzyłem alias: alias pretty='python -mjson.tool | pygmentize -l jsontak, że mogę po prostu uruchomić: command params | pretty. Mam nadzieję że to pomoże. PS: Jeśli komuś uda się to rozszerzyć na a) usuń zwijające się wyjście, które widzę za każdym razem i / lub b) NIE sortuj kluczy JSON; proszę daj mi znać, będę bardzo wdzięczny.
Clint Eastwood,
1023

Możesz użyć: jq

Jest bardzo prosty w obsłudze i działa świetnie! Obsługuje bardzo duże struktury JSON, w tym strumienie. Ich samouczki można znaleźć tutaj .

Przykłady użycia:

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

The. jest filtrem tożsamości.

Vita Pluvia
źródło
11
Istnieje również --sort-keysopcja, która jest pomocna w niektórych przypadkach.
Matthew Flaschen
9
Praca z curl:curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
Hover Ruan
19
„jq.” jest świetny jako ładna drukarka, ale zawiera zastrzeżenie: jq (do wersji jq włącznie włącznie) zmieni wartości bardzo dużych i bardzo małych liczb, ponieważ analizuje wartości liczbowe jako wartości 64-bitowe IEEE 754. Aby sprawdzić, czy Twoja ulubiona ładna drukarka ma ten sam problem, wypróbuj tę wartość: 1e1000. Zauważ, że python -mjson.tool źle kończy ten test, ponieważ produkuje Infinity, który nie jest nawet JSON.
szczyt
1
Na marginesie, można przekierować sformatowany wynik do pliku: echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfile.
Czad
26
@ Meekohi alternatywą jest „niepotrzebne użycie echa”. Bardzo się cieszę, że znalazłem <<<operatora - dokładnie tego, czego szukałem.
jchook
381

Używam argumentu „spacja”, JSON.stringifyaby ładnie wydrukować JSON w JavaScript.

Przykłady:

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

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

Z wiersza polecenia systemu Unix za pomocą Node.js, określając JSON w wierszu polecenia:

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

Zwroty:

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

Z wiersza polecenia systemu Unix w Node.js, określając nazwę pliku zawierającą JSON i używając wcięcia o czterech spacjach:

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

Za pomocą rury:

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));\
 });\
"
Krinkle
źródło
10
Do debugowania obiektów w Node.js powinieneś użyć sys.inspect () zamiast JSON.stringify (). Oto dlaczego: markhansen.co.nz/inspecting-with-json-stringify
Gurpartap Singh
11
Doceniony. OP dotyczy „skryptu wiersza polecenia * * nix” i ta odpowiedź ma inny kontekst.
danorton,
49
@danorton: JS może być używany z wiersza poleceń za pośrednictwem node.js i innych podobnych rozwiązań.
calvinf,
10
Nie ma potrzeby konsoli: wyświetla node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"również wynik do STDOUT.
Julian D.
2
Bani, że skrypt jest inny dla nazwy pliku vs. stdin
Łukasz Wiktor
340

Napisałem narzędzie, które ma jeden z najlepszych dostępnych formatów „inteligentnych białych znaków”. Daje bardziej czytelny i mniej szczegółowy wydruk niż większość innych opcji tutaj.

podkreślenie-cli

Tak wygląda „inteligentna biała spacja”:

Być może jestem nieco stronniczy, ale to niesamowite narzędzie do drukowania i manipulowania danymi JSON z wiersza poleceń. Jest bardzo przyjazny w użyciu i posiada obszerną pomoc / dokumentację z wiersza poleceń. To szwajcarski scyzoryk, którego używam do 1001 różnych małych zadań, które byłyby zaskakująco denerwujące, aby robić to w inny sposób.

Najnowszy przypadek użycia: Chrome, konsola programistów, karta Sieć, wyeksportuj wszystko jako plik HAR, „cat site.har | podkreślenie wybierz„ .url ”--outfmt tekst | grep mydomain”; teraz mam chronologicznie uporządkowaną listę wszystkich pobrań adresów URL wykonanych podczas ładowania strony mojej firmy.

Ładne drukowanie jest łatwe:

underscore -i data.json print

Ta sama rzecz:

cat data.json | underscore print

To samo, bardziej jednoznacznie:

cat data.json | underscore print --outfmt pretty

To narzędzie jest moim aktualnym projektem pasji, więc jeśli masz jakieś prośby o nowe funkcje, istnieje duża szansa, że ​​się nimi zajmę.

Dave Dopson
źródło
4
Zaktualizowałem również mój ~ / .bash_profile, aby wyświetlał następujący wiersz: alias underscor = 'underscore print --outfmt pretty' teraz mogę teraz zrobić curl example.com/result.json | podkreśl i nadal używaj podkreślenia do innego formatowania
Gal Bracha,
Dzięki Dave! Narzędzie jest dobre! alias pretty-json = "underrsore pretty" i curl wyjście przyjemne dla oka
Maxim Ponomarev
Świetne narzędzie do formatowania, tylko jedna uwaga: przekazywanie danych wyjściowych do pliku (z opcją -o lub z > ) działa tylko z nadrukiem podkreślenia . podkreślenia dość zapisuje plik z włożeniu znaki formatowania kolorów, smth jak: [32m, [33m, [39mwraz z niektórymi niedrukowalny przed każdym z nich, co sprawia, że nie ważne JSON. Jednak sam druk podkreślenia nie dodaje niczego do pliku i doskonale wykonuje jego zadanie formatowania.
tiurin
Uwielbiam, jqale działało to doskonale dla mojego „JSON”, który nie miał podwójnie cytowanych klawiszy.
Bluu
@DaveDopson dzięki za świetne narzędzie !! Spróbuję użyć go razem z jsonselect.org/#tryit ...
mycargus
173

Zwykle po prostu robię:

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

Aby pobrać wybrane dane (w tym przypadku wartość „testową”):

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

Jeśli dane JSON znajdują się w pliku:

python -mjson.tool filename.json

Jeśli chcesz to wszystko zrobić za jednym razem, curlw wierszu polecenia za pomocą tokena uwierzytelniającego:

curl -X GET -H "Authorization: Token wef4fwef54te4t5teerdfgghrtgdg53" http://testsite/api/ | python -mjson.tool
locojay
źródło
jeśli json ma pochodzić bezpośrednio z http api, jest to również ładne narzędzie zaimplementowane w pythonie: github.com/jkbr/httpie
Florian
Jeśli masz zainstalowany węzeł (i nie przejmuj się wyjściem w stylu YAML), jest też ten pakiet: rafeca.com/prettyjson, dzięki czemu możesz zakończyć zawijanie | prettyjson
Iolo
3
Jak wspomniano powyżej, jednym z problemów z python -mjson.tool jako ładną drukarką JSON jest to, że nie zawsze emituje JSON. Np. 1e1000 zmienia się w Nieskończoność (niezależnie od tego, czy używasz Pythona 2.x czy 3.x). „jq.” zawsze tworzy JSON, ale nie gwarantuje, że bardzo duże (lub bardzo małe wartości) zostaną zachowane dokładnie.
szczyt
88

Dzięki bardzo pomocnym wskazówkom JF Sebastiana, oto nieco ulepszony skrypt, który wymyśliłem:

#!/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))
AnC
źródło
3
Po załadowaniu wartości do słownika kolejność jest tracona: normalne dictobiekty nie mają określonej kolejności. Spróbuj, json.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False)a przekonasz się, że i tak zostały zamienione. Aby to naprawić, zaimportuj OrderedDicti loadprzekaż object_pairs_hook=OrderedDict.
icktoofay
Można zmienić skrypt czytać ze standardowego wejścia z tym: inputFile = sys.stdin. Dzięki temu możesz przesyłać rzeczy do skryptu w następujący sposób:curl http://somewhere.com/foo.json | pp_json.py
Gabe Johnson
1
I aby uniknąć sortowania z komentarzem użytkownika @ icktoofay, import OrderedDict tak: from collections import OrderedDict.
Hugo,
2
Dzięki @icktoofay. Pozwoliło mi to utworzyć następującą funkcję vima: com! FormatJSON %!python -c "from collections import OrderedDict; import sys; import json; j = json.load(sys.stdin, object_pairs_hook=OrderedDict); json.dump(j, sys.stdout, sort_keys=False, indent=4, separators=(',', ': '))" Zauważ, że separatory muszą być ustawione jako (',', ':'), aby uniknąć dodawania białych spacji: bugs.python.org/issue16333
blindsnowmobile
Świetny urywek! Użyłem sort_keys = Truezamiast tego, ponieważ chcę tego użyć do porównania plików JSON i działa to jak urok.
JL Peyret
81

Jeśli używasz npm i Node.js, możesz to zrobić, npm install -g jsona następnie przesłać polecenie json. Zrób, json -haby uzyskać wszystkie opcje. Może także wyciągać określone pola i pokolorować wydruk -i.

curl -s http://search.twitter.com/search.json?q=node.js | json
gregers
źródło
79

Nie jest to zbyt proste z rodzimym sposobem za pomocą narzędzi jq .

Na przykład:

cat xxx | jq .
Peter Mortensen
źródło
7
OSTRZEŻENIE: jq koduje liczby jako zmiennoprzecinkowe 64-bitowe IEEE 754, dlatego ich reprezentacja może ulec zmianie. Precyzja bardzo małych i bardzo dużych liczb prawdopodobnie zostanie utracona. Aby sprawdzić, czy Twoja ulubiona ładna drukarka ma ten sam problem, wypróbuj tę wartość: 1e1000.
szczyt
5
lub po prostu jq . file.json:; ale także cat file.json | jq(bez filtra .) również działa. (na Ubuntu / Linux; ymmv na różnych platformach)
michael
73

W Perlu użyj modułu CPAN JSON::XS. Instaluje narzędzie wiersza polecenia json_xs.

Uprawomocnić:

json_xs -t null < myfile.json

Prettify plik JSON, src.jsonaby pretty.json:

< src.json json_xs > pretty.json

Jeśli nie masz json_xs, spróbuj json_pp. „pp” dotyczy „czystego perla” - narzędzie jest implementowane tylko w Perlu, bez powiązania z zewnętrzną biblioteką C (co oznacza XS, „System rozszerzenia” Perla).

knb
źródło
9
Wydaje się, że jest standardem w Cygwin!
Janus Troelsen
12
json_pp może być używany w ten sam sposób i najprawdopodobniej jest łatwo instalowany w twoim systemie (w Debianie jest w pakiecie „perl”).
MichielB,
8
Do Twojej wiadomości, w moim systemie Mac OS X 10.9, json_pp jest dostępny automatycznie.
Gregg Williams
-t nulldał mi wartość zerową: nie jest to prawidłowy toformat ... ale rezygnacja z niego działała doskonale . Dzięki.
Lucas,
pp jest dla czystego perla, a nie ładnego wydruku tutaj :) Ponieważ json_xs i json_pp mogą zrobić więcej niż tylko ładny wydruk, a także z -json_opt zrobić inne rzeczy zamiast ładnego drukowania. Chociaż ładnym drukowaniem jest zachowanie domyślne.
Kjetil S.
70

Na * nix, czytanie ze standardowego wejścia i pisanie na standardowe wyjście działa lepiej:

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

Umieść to w pliku (nazwa mojego „ładnaJSON” po odpowiedzi AnC ) w ŚCIEŻCE i chmod +xgotowe, i możesz już iść.

Daryl Spitzer
źródło
Rzeczywiście, użycie stdin / stdout jest znacznie bardziej elastyczne i proste. Dzięki za zwrócenie na to uwagi.
AnC
3
W przypadku programów, które oczekują nazwanego pliku, użyj / dev / stdin, ditto dla out i err.
dvogel,
4
FYI fileinput.input()czyta ze standardowego wejścia, jeśli w wierszu poleceń nie podano żadnych plików. Przykład
jfs
fileinput.input () nie radzi sobie dobrze z plikami bez końca nowej linii, kiedy ostatnio sprawdzałem.
Zachary Vance,
pyta w skrypcie powłoki, a nie w innym języku Python. Z JQ można to zrobić doskonale.
Bui Anh Tuan
65

Rubinowy klejnot JSON jest dostarczany ze skryptem powłoki, który upiększa JSON:

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

Pobieranie skryptu: gist.github.com/3738968

Paul Horsfall
źródło
6
Zauważ, że to rozwiązanie dekoduje sekwencje specjalne „\ uxxxx” w Unicode, w przeciwieństwie do Pythona z json.tool. Wydaje się jednak, że ma również ograniczenia zagnieżdżania ( nesting of 20 is too deep (JSON::NestingError)).
annm
2
na Ubuntu możesz zrobić: sudo apt-get install ruby-json-purezamiastgem install
Janus Troelsen
1
`` eric-mbp: ~ ericstob $ sudo gem install json Hasło: Pobieranie: json-1.7.3.gem (100%) Budowanie rozszerzeń natywnych. Może to chwilę potrwać ... Zainstalowano pomyślnie json-1.7.3 Zainstalowano 1 klejnot Instalowanie dokumentacji ri dla json-1.7.3 ... Instalowanie dokumentacji RDoc dla json-1.7.3 ... eric-mbp: ~ ericstob $ prettify_json .rb -bash: prettify_json.rb: nie znaleziono polecenia
Eric Hartford
może mógłbyś opublikować zawartość swojego prettify_json.rb?
Andrew
Można pobrać skrypt, przenieść go do ~/binfolderu (upewnij się, że to w PATH) zmiany nazwy prettify_json.rbdo ppji run chmod +x ppj. Teraz możesz zrobić coś takiegocurl www.jsonsring.com/something.json | ppj
Uri,
58

AKTUALIZACJA Używam jqteraz, jak sugerowano w innej odpowiedzi. Jest niezwykle wydajny w filtrowaniu JSON, ale w najprostszym przypadku jest także świetnym sposobem na wydrukowanie JSON do oglądania.

jsonpp to bardzo ładna drukarka JSON z wiersza poleceń.

Z README:

Całkiem drukowane odpowiedzi usług internetowych, takie jak:

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

i upiększyć pliki biegające po dysku:

jsonpp data/long_malformed.json

Jeśli korzystasz z systemu Mac OS X, możesz brew install jsonpp. Jeśli nie, możesz po prostu skopiować plik binarny do dowolnego miejsca w swoim pliku $PATH.

jordelver
źródło
1
Próbowałem jsonpp (używany w przeszłości z powodzeniem) przeciwko ogromnemu plikowi (> 60 MB). Zatrzymałem to po 5 minutach. I rurami go do python -mjson.tool(z innej odpowiedzi tutaj) i zajęło 10-20sec ...
Völker
60 MB JSON? Łał! Zwykle nie mam do czynienia z plikami tak dużymi, ale przydatnymi do poznania. Dzięki.
jordelver
Na moim urządzeniu ubuntu mam json_pp- który ładnie formatuje Json, chociaż pomimo podobieństwa w nazewnictwie, uważam, że jest to zupełnie inny projekt niż jsonppwspomniany tutaj
davidpricedev
56

Tak to robię:

curl yourUri | json_pp

Skraca kod i wykonuje zadanie.

JedatKinports
źródło
3
Serwer Ubuntu: jeśli masz maszyny produkcyjne z bardzo ograniczonymi instalacjami, może to być najlepszy wybór, ponieważ jest instalowany domyślnie pod określoną nazwą. Python jest często instalowany na różne sposoby (np. Python3, python lub wcale) w zależności od wersji.
jonathanjo
55

prosty skrypt bash do ładnego drukowania json

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

Przykład:

cat file.json | json_pretty.sh
Jewgienij Karpow
źródło
1
Dzięki za opinie. Właśnie napisałem ten skrypt dzisiaj do użytku osobistego i działał dobrze w moich przypadkach. Poprawiłem, teraz jest mniejszy i bez tego problemu. Nie ma celu, aby w pełni obsługiwać formatowanie, ale w razie potrzeby mogę wprowadzić inne poprawki.
Evgeny Karpov
2
To tylko działająca odpowiedź, którą znalazłem. Mam Embedded Linux - bez Rubby, bez JavaScript, nie ma dostępu do Internetu, aby pobrać moduły Pythona ... Mam nieco inny awk, który nie obsługuje %*cnotacji więc zmienił printfsię c=0; while (c++<offset) printf " "; printf $0;. A mój awk ma różne znaki ucieczki wyrażeń regularnych i odwrotny ukośnik nie działa []. Zmieniłem wyrażenia regularne na /^[[{]/i /[]}]/.
Zaboj Campula
2
To powinno być zaakceptowane, ponieważ jest w pełni natywne i nie wymaga oprogramowania innych firm ...
Blag
1
@EggenyKarpov niezły haczyk, nie ma potrzeby pełnego cofania, tylko grepto zostało usunięte przez pomyłkę;)
Blag
1
Dzięki koleś, chciałem szybko sformatować 8-megabajtowy jednowarstwowy Json, w prosty prosty sposób.
Ahmed M
53

Spróbować pjson. Ma kolory!

echo '{"json": "obj"} |  pjson

Zainstaluj z pip:

⚡ pip install pjson

A następnie potokuj dowolną zawartość JSON do pjson.

Johann Philipp Strathausen
źródło
Wymaga python-pip (sudo apt-get install python-pip), a następnie (sudo pip install pjson) Wielką zaletą są kolory!
Kristjan Adojaan
1
Wadą jest to, że nie można grepować kolorowych wydruków.
Kristjan Adojaan
51
$ 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"
}

UWAGA: To nie jest sposób to zrobić.

To samo w Perlu:

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

Uwaga 2: Jeśli biegniesz

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

dobrze czytelne słowo zostanie zakodowane

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

Jeśli pozostała część Twojego potoku z wdziękiem poradzi sobie z Unicode i chcesz, aby Twój JSON był również przyjazny dla ludzi, po prostu użyj 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)'

a dostaniesz:

{
    "Düsseldorf": "lorem", 
    "bar": "ipsum"
}
JF Sebastian
źródło
właściwie robię to samo, ale z samym javascript :)
Robert Gould
2
W wersji modułu JSON, którą mam, to_jsonwydaje się nie akceptować opcji. Ale to działa:perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
Rörd
Przykład w języku Python można uprościć. O wiele łatwiej jest bezpośrednio podłączyć wyjście JSON python -m json.tool.
Dan Loewenherz
@Dan: tak. Istnieje kilka odpowiedzi, które pokazują json.toolprzykłady kodu. 1. ta wersja umożliwia zmianę niektórych parametrów, np. indent2. W momencie publikowania (2008) nadal używany był Python 2.4 , który nie obsługuje-mjson.tool
jfs
40

Używam jshon do robienia dokładnie tego, co opisujesz . Po prostu biegnij:

echo $COMPACTED_JSON_TEXT | jshon

Możesz także przekazać argumenty, aby przekształcić dane JSON.

yardena
źródło
Dzięki, jshon jest dużo szybszy niż używanie Pythona lub Ruby do tego samego zadania
Alexander
2
@Alexander - Jak szybko potrzebujesz ładnej drukarki? Jestem na OSx Lion, który jest fabrycznie wyposażony w Python. Za pomocą python -mjson.tool mogę dość wydrukować plik json o wielkości 96 KB w 0,1 s - wyjście json Earthporna, do którego prowadzi łącze jshon, wynosi około 24 KB i mogę to dość wydrukować w 0,08 s. O ile szybciej jest dla Ciebie jshon?
joensson,
1
Pracuję ze skompresowanymi plikami danych JSON o rozmiarze 1 + GB (kto nawet wie, jak duże nieskompresowane) pliki danych JSON, więc bardzo doceniam sugestię, że jshon jest szybszy.
Ryan Ballantyne
38

Lub z Ruby:

echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'
darscan
źródło
To daje mi błąd. Czy potrzebujesz zainstalowanego pakietu Ruby Json?
mjs
3
Tak, potrzebujesz JSON Ruby Gem: sudo gem install json
darscan
@ MatSchaffer Pamiętaj, że to nie działa, jeśli używasz JSON do serializacji obiektów to_jsonmetodami niestandardowymi ; Kernel#jjdrukuje tylko takie same tablice i skróty (lub liczby / ciągi znaków / booleany).
Phrogz
W systemie Windows spróbuj wykonać następujące czynności: echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
Ross Attrill
36

Sprawdź Jazor . Jest to prosty parser JSON z linii poleceń napisany w Rubim.

gem install jazor
jazor --help
Mike Conigliaro
źródło
4
Czy to tylko ja, czy to jedyna sugestia, która faktycznie odpowiada na pytanie PO? Przybyłem tutaj, szukając prostego polecenia, do którego mógłbym przesłać dane wyjściowe, curli to jest jedyne, które zrobiło to dla mnie.
Leo Cassarani,
2
Podoba mi się, że ma opcję pokolorowania wydruku. Ułatwia czytanie.
Andrew
ooh Podoba mi się również opcja przekazania adresu URL, ponieważ używam go do wyświetlania danych wyjściowych mojego interfejsu API REST
Andrew,
35

Możesz użyć tego prostego polecenia, aby osiągnąć wynik:

echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool
Arpit Rathod
źródło
Najlepsza odpowiedź moim zdaniem. Mały i łatwy do zapamiętania i nie wymaga instalowania żadnych niestandardowych narzędzi.
Eugene C
python -m json.tool nie wydaje się zachowywać kolejności obiektu JSON.
pushNpop,
31

JSONLint ma implementację typu open source na GitHub, której można użyć w wierszu polecenia lub dołączyć do projektu Node.js.

npm install jsonlint -g

i wtedy

jsonlint -p myfile.json

lub

curl -s "http://api.twitter.com/1/users/show/user.json" | jsonlint | less
Salman A.
źródło
28

Po prostu potokuj wyjście do jq ..

Przykład:

twurl -H ads-api.twitter.com '.......' | jq .
Benjamin W.
źródło
Dobra odpowiedź @Ashshaey Singh i można łatwo przekierować to samo do pliku. np.cat <file_name.txt> | jq . > <output_name.txt>
Pramit
9
brew install jqjeśli jesteś na Mac OS.
Distwo
1
Niestety używanie jq .do ładnego drukowania ma jedną potencjalną wadę: wszystkie istniejące wersje jq nalegają na traktowanie liczb JSON jako liczb IEEE, więc precyzję łatwo utracić, np. W przypadku bardzo dużych liczb całkowitych.
szczyt
2
@Pramit cat file |niezmiennie jest stratą procesu; po prostu zrób jq . <file_name.txt >output_name.txt(za pomocą literału <i >znaków).
Mark Reed,
24

Pigmentuj

Łączę json.tool Pythona z pygmentize:

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

Istnieje kilka alternatyw dla pygmentowania, które są wymienione w mojej odpowiedzi .

Oto demo na żywo:

Próbny

Shubham Chaudhary
źródło
5
Czasami trzeba użyć, pygmentize -l jsonaby uzyskać zabarwienie.
JP
Zainstalować z pakietu apt python-pygments, czyliapt-get install python-pygments
jan
23

W Perlu, jeśli zainstalujesz JSON :: PP z CPAN, dostaniesz polecenie json_pp . Kradnąc przykład z B Bycroft otrzymujesz:

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

Warto wspomnieć, że json_ppjest fabrycznie zainstalowany z Ubuntu 12.04 (przynajmniej) i Debianem/usr/bin/json_pp

Philip Durbin
źródło
19

Polecam użycie narzędzia wiersza polecenia json_xs, które jest zawarte w module perlowym JSON :: XS. JSON :: XS to moduł Perla do serializacji / deserializacji JSON, na maszynie Debian lub Ubuntu możesz go zainstalować w następujący sposób:

sudo apt-get install libjson-xs-perl

Jest oczywiście dostępny również w CPAN .

Aby użyć go do sformatowania JSON uzyskanego z adresu URL, możesz użyć curl lub wget w następujący sposób:

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

albo to:

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

i aby sformatować JSON zawarty w pliku, możesz to zrobić:

$ json_xs < file-full-of.json

Aby sformatować jako YAML , co niektórzy uważają za bardziej czytelne dla ludzi niż JSON:

$ json_xs -t yaml < file-full-of.json
htaccess
źródło
19

Możesz po prostu użyć standardowych narzędzi, takich jak jq lub json_pp.

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

lub

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

będzie zarówno upiększać dane wyjściowe jak poniżej (jq nawet bardziej kolorowe):

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

Ogromną zaletą jq jest to, że może zrobić DUŻO więcej, jeśli chcesz parsować i przetwarzać json.

Schmitzi
źródło
json_pp był na moim Macu - ale nie jq. Dzięki!
David H
1
@DavidH - czy to pomaga: stackoverflow.com/questions/37668134/…
Schmitzi
dzięki! Nigdy wcześniej nie słyszałem o JQ.
David H
17

jj jest superszybki, potrafi ekonomicznie obsługiwać gigantyczne dokumenty JSON, nie zadziera z prawidłowymi numerami JSON i jest łatwy w użyciu, np.

jj -p # for reading from STDIN

lub

jj -p -i input.json

Jest (2018) wciąż całkiem nowy, więc może nie będzie obsługiwał nieprawidłowego JSON w oczekiwany sposób, ale łatwo go zainstalować na głównych platformach.

szczyt
źródło
16
  1. brew install jq
  2. command + | jq
  3. (przykład curl localhost:5000/blocks | jq:)
  4. Cieszyć się!

wprowadź opis zdjęcia tutaj

alexanderjsingleton
źródło
12

Zainstaluj yajl-tools za pomocą poniższego polecenia:

sudo apt-get install yajl-tools

następnie,

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

Uma sankar pradhan
źródło
Niesamowite. Nie wymaga innego języka / tłumacza i znajduje się w repozytorium pakietów, nie trzeba zaparzać!
Joseph Lust