Как я могу красиво напечатать JSON в сценарии оболочки? - PullRequest
2751 голосов
/ 09 декабря 2008

Существует ли (Unix) сценарий оболочки для форматирования JSON в удобочитаемой форме?

По сути, я хочу преобразовать следующее:

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

... примерно так:

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

Ответы [ 54 ]

64 голосов
/ 29 декабря 2009

JSON Ruby Gem поставляется со сценарием оболочки для предварительной JSON:

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

Скачать скрипт: gist.github.com / 3738968

55 голосов
/ 21 мая 2013

ОБНОВЛЕНИЕ Я использую jq сейчас, как предложено в другом ответе. Он чрезвычайно эффективен при фильтрации JSON, но, по сути, также является отличным способом печати JSON для просмотра.

jsonpp - это очень приятный JSON-принтер для командной строки.

от README:

Довольно распечатка ответов веб-сервиса примерно так:

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

и создайте красивые файлы на вашем диске:

jsonpp data/long_malformed.json

Если вы работаете в Mac OS X, вы можете brew install jsonpp. Если нет, вы можете просто скопировать двоичный файл куда-нибудь в ваш $PATH.

51 голосов
/ 29 января 2013

Попробуйте pjson. У него есть цвета!

echo '{

Установите его с pip:

⚡ pip install pjson

А затем передать любой JSON-контент на pjson.

48 голосов
/ 03 февраля 2017

Вот как я это делаю:

curl yourUri | json_pp

Сокращает код и выполняет работу.

42 голосов
/ 09 декабря 2008
$ 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"
}

ПРИМЕЧАНИЕ. Это не способ сделать это.

То же самое в Perl:

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

Примечание 2: Если вы запускаете

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

хорошо читаемое слово становится \ u закодированным

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

Если остальная часть вашего конвейера будет корректно обрабатывать юникод, и вы хотите, чтобы ваш JSON также был дружественным к человеку, просто используйте 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)'

и вы получите:

{
    "Düsseldorf": "lorem", 
    "bar": "ipsum"
}
39 голосов
/ 20 мая 2011

Я использую jshon , чтобы сделать именно то, что вы описываете. Просто беги:

echo $COMPACTED_JSON_TEXT | jshon

Вы также можете передавать аргументы для преобразования данных JSON.

37 голосов
/ 21 октября 2009

Или с Рубином:

echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'
36 голосов
/ 25 января 2011

Выезд Jazor . Это простой JSON-анализатор командной строки, написанный на Ruby.

gem install jazor
jazor --help
30 голосов
/ 27 апреля 2012

JSONLint имеет реализацию с открытым исходным кодом на GitHub , которую можно использовать в командной строке или включить в проект Node.js.

npm install jsonlint -g

, а затем

jsonlint -p myfile.json

или

curl -s "http://api.twitter.com/1/users/show/user.json" | jsonlint | less
29 голосов
/ 27 июля 2016

простой скрипт bash для красивой печати в формате 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}'

Пример:

cat file.json | json_pretty.sh
...