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"
}
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"
}
json
biblioteki Pythona , ale dodałem również pigmety, aby uzyskać wyróżnianie składni.Odpowiedzi:
Dzięki Python 2.6+ możesz po prostu:
lub, jeśli JSON znajduje się w pliku, możesz wykonać:
jeśli JSON pochodzi ze źródła internetowego, takiego jak API, możesz użyć
Dla wygody we wszystkich tych przypadkach możesz utworzyć alias:
Aby uzyskać jeszcze większą wygodę i nieco więcej pisania, aby się przygotować:
dla wszystkich powyższych przypadków. Możesz to włożyć
.bashrc
i będzie ono dostępne za każdym razem w powłoce. Wywołaj to jakprettyjson_s '{"foo": "lorem", "bar": "ipsum"}'
.źródło
pygmentize -l javascript
aby uzyskać kolorowe wyjście w linii poleceń. Edycja : Jeśli masz już zainstalowane pigwy.alias pretty='python -mjson.tool | pygmentize -l json
tak, ż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.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:
The. jest filtrem tożsamości.
źródło
--sort-keys
opcja, która jest pomocna w niektórych przypadkach.curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfile
.<<<
operatora - dokładnie tego, czego szukałem.Używam argumentu „spacja”,
JSON.stringify
aby ładnie wydrukować JSON w JavaScript.Przykłady:
Z wiersza polecenia systemu Unix za pomocą Node.js, określając JSON w wierszu polecenia:
Zwroty:
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:
Za pomocą rury:
źródło
node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"
również wynik do STDOUT.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:
Ta sama rzecz:
To samo, bardziej jednoznacznie:
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ę.
źródło
[32m
,[33m
,[39m
wraz 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.jq
ale działało to doskonale dla mojego „JSON”, który nie miał podwójnie cytowanych klawiszy.Zwykle po prostu robię:
Aby pobrać wybrane dane (w tym przypadku wartość „testową”):
Jeśli dane JSON znajdują się w pliku:
Jeśli chcesz to wszystko zrobić za jednym razem,
curl
w wierszu polecenia za pomocą tokena uwierzytelniającego:źródło
| prettyjson
Dzięki bardzo pomocnym wskazówkom JF Sebastiana, oto nieco ulepszony skrypt, który wymyśliłem:
źródło
dict
obiekty 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ć, zaimportujOrderedDict
iload
przekażobject_pairs_hook=OrderedDict
.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
from collections import OrderedDict
.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/issue16333sort_keys = True
zamiast tego, ponieważ chcę tego użyć do porównania plików JSON i działa to jak urok.Jeśli używasz npm i Node.js, możesz to zrobić,
npm install -g json
a następnie przesłać poleceniejson
. Zrób,json -h
aby uzyskać wszystkie opcje. Może także wyciągać określone pola i pokolorować wydruk-i
.źródło
Nie jest to zbyt proste z rodzimym sposobem za pomocą narzędzi jq .
Na przykład:
źródło
jq . file.json
:; ale takżecat file.json | jq
(bez filtra.
) również działa. (na Ubuntu / Linux; ymmv na różnych platformach)W Perlu użyj modułu CPAN
JSON::XS
. Instaluje narzędzie wiersza poleceniajson_xs
.Uprawomocnić:
Prettify plik JSON,
src.json
abypretty.json
:Jeśli nie masz
json_xs
, spróbujjson_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).źródło
-t null
dał mi wartość zerową: nie jest to prawidłowy toformat ... ale rezygnacja z niego działała doskonale . Dzięki.Na * nix, czytanie ze standardowego wejścia i pisanie na standardowe wyjście działa lepiej:
Umieść to w pliku (nazwa mojego „ładnaJSON” po odpowiedzi AnC ) w ŚCIEŻCE i
chmod +x
gotowe, i możesz już iść.źródło
fileinput.input()
czyta ze standardowego wejścia, jeśli w wierszu poleceń nie podano żadnych plików. PrzykładRubinowy klejnot JSON jest dostarczany ze skryptem powłoki, który upiększa JSON:
Pobieranie skryptu: gist.github.com/3738968
źródło
json.tool
. Wydaje się jednak, że ma również ograniczenia zagnieżdżania (nesting of 20 is too deep (JSON::NestingError)
).sudo apt-get install ruby-json-pure
zamiastgem install
prettify_json.rb
?~/bin
folderu (upewnij się, że to w PATH) zmiany nazwyprettify_json.rb
doppj
i runchmod +x ppj
. Teraz możesz zrobić coś takiegocurl www.jsonsring.com/something.json | ppj
AKTUALIZACJA Używam
jq
teraz, 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:
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
.źródło
python -mjson.tool
(z innej odpowiedzi tutaj) i zajęło 10-20sec ...json_pp
- który ładnie formatuje Json, chociaż pomimo podobieństwa w nazewnictwie, uważam, że jest to zupełnie inny projekt niżjsonpp
wspomniany tutajTak to robię:
Skraca kod i wykonuje zadanie.
źródło
prosty skrypt bash do ładnego drukowania json
json_pretty.sh
Przykład:
źródło
%*c
notacji więc zmieniłprintf
się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/[]}]/
.grep
to zostało usunięte przez pomyłkę;)Spróbować
pjson
. Ma kolory!Zainstaluj z
pip
:⚡ pip install pjson
A następnie potokuj dowolną zawartość JSON do
pjson
.źródło
UWAGA: To nie jest sposób to zrobić.
To samo w Perlu:
Uwaga 2: Jeśli biegniesz
dobrze czytelne słowo zostanie zakodowane
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
a dostaniesz:
źródło
to_json
wydaje się nie akceptować opcji. Ale to działa:perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
python -m json.tool
.json.tool
przykłady kodu. 1. ta wersja umożliwia zmianę niektórych parametrów, np.indent
2. W momencie publikowania (2008) nadal używany był Python 2.4 , który nie obsługuje-mjson.tool
Używam jshon do robienia dokładnie tego, co opisujesz . Po prostu biegnij:
Możesz także przekazać argumenty, aby przekształcić dane JSON.
źródło
Lub z Ruby:
źródło
to_json
metodami niestandardowymi ;Kernel#jj
drukuje tylko takie same tablice i skróty (lub liczby / ciągi znaków / booleany).echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
Sprawdź Jazor . Jest to prosty parser JSON z linii poleceń napisany w Rubim.
źródło
curl
i to jest jedyne, które zrobiło to dla mnie.Możesz użyć tego prostego polecenia, aby osiągnąć wynik:
źródło
JSONLint ma implementację typu open source na GitHub, której można użyć w wierszu polecenia lub dołączyć do projektu Node.js.
i wtedy
lub
źródło
Po prostu potokuj wyjście do
jq .
.Przykład:
źródło
cat <file_name.txt> | jq . > <output_name.txt>
brew install jq
jeśli jesteś na Mac OS.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.cat file |
niezmiennie jest stratą procesu; po prostu zróbjq . <file_name.txt >output_name.txt
(za pomocą literału<
i>
znaków).Pigmentuj
Łączę json.tool Pythona z pygmentize:
Istnieje kilka alternatyw dla pygmentowania, które są wymienione w mojej odpowiedzi .
Oto demo na żywo:
źródło
pygmentize -l json
aby uzyskać zabarwienie.python-pygments
, czyliapt-get install python-pygments
W Perlu, jeśli zainstalujesz JSON :: PP z CPAN, dostaniesz polecenie json_pp . Kradnąc przykład z B Bycroft otrzymujesz:
Warto wspomnieć, że
json_pp
jest fabrycznie zainstalowany z Ubuntu 12.04 (przynajmniej) i Debianem/usr/bin/json_pp
źródło
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:
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:
albo to:
i aby sformatować JSON zawarty w pliku, możesz to zrobić:
Aby sformatować jako YAML , co niektórzy uważają za bardziej czytelne dla ludzi niż JSON:
źródło
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):
Ogromną zaletą jq jest to, że może zrobić DUŻO więcej, jeśli chcesz parsować i przetwarzać json.
źródło
jj jest superszybki, potrafi ekonomicznie obsługiwać gigantyczne dokumenty JSON, nie zadziera z prawidłowymi numerami JSON i jest łatwy w użyciu, np.
lub
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.
źródło
brew install jq
command + | jq
curl localhost:5000/blocks | jq
:)źródło
bat
jestcat
klonem z podświetlaniem składni:Przykład:
-p
wyświetli bez nagłówków i-l
wyraźnie określi język.Ma kolorowanie i formatowanie dla JSON i nie ma problemów odnotowanych w tym komentarzu: Jak mogę ładnie wydrukować JSON w skrypcie powłoki?
źródło
Zainstaluj yajl-tools za pomocą poniższego polecenia:
sudo apt-get install yajl-tools
następnie,
echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat
źródło