Есть ли (Unix) оболочка script для форматирования JSON в удобочитаемой форме?
В принципе, я хочу, чтобы он преобразовал следующее:
{ "foo": "lorem", "bar": "ipsum" }
... в нечто подобное:
{
    "foo": "lorem",
    "bar": "ipsum"
}
Есть ли (Unix) оболочка script для форматирования JSON в удобочитаемой форме?
В принципе, я хочу, чтобы он преобразовал следующее:
{ "foo": "lorem", "bar": "ipsum" }
... в нечто подобное:
{
    "foo": "lorem",
    "bar": "ipsum"
}
С Python 2. 6+ вы можете просто сделать:
echo '{"foo": "lorem", "bar": "ipsum"}' | python -m json.tool
или, если JSON находится в файле, вы можете сделать:
python -m json.tool my_json.json
если JSON находится из интернет-источника, такого как API, вы можете использовать
curl http://my_url/ | python -m json.tool
Для удобства во всех этих случаях вы можете создать псевдоним:
alias prettyjson='python -m json.tool'
Для еще большего удобства с немного более типизированным, чтобы подготовить его:
prettyjson_s() {
    echo "$1" | python -m json.tool
}
prettyjson_f() {
    python -m json.tool "$1"
}
prettyjson_w() {
    curl "$1" | python -m json.tool
}
 для всех вышеперечисленных случаев. Вы можете поместить это в .bashrc и он будет доступен каждый раз в оболочке. prettyjson_s '{"foo": "lorem", "bar": "ipsum"}' его как prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'.
Вы можете использовать: jq
Он очень прост в использовании, и он отлично работает! Он может обрабатывать очень большие структуры JSON, включая потоки. Ты можешь найти их учебники здесь.
Вот пример:
$ jq . <<< '{ "foo": "lorem", "bar": "ipsum" }'
{
  "bar": "ipsum",
  "foo": "lorem"
}
Или другими словами:
$ echo '{ "foo": "lorem", "bar": "ipsum" }' | jq .
{
  "bar": "ipsum",
  "foo": "lorem"
}
Я использую аргумент "пробел" в JSON.stringify, чтобы красиво печатать JSON в JavaScript.
Примеры:
// Indent with 4 spaces
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, 4);
// Indent with tabs
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, '\t');
Из командной строки Unix с Node.js укажите JSON в командной строке:
$ node -e "console.log(JSON.stringify(JSON.parse(process.argv[1]), null, '\t'));" \
  '{"foo":"lorem","bar":"ipsum"}'
Returns:
{
    "foo": "lorem",
    "bar": "ipsum"
}
Из командной строки Unix с Node.js, указав имя файла, содержащее JSON, и используя отступ из четырех пробелов:
$ node -e "console.log(JSON.stringify(JSON.parse(require('fs') \
      .readFileSync(process.argv[1])), null, 4));"  filename.json
Использование pipes:
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));\
 });\
"
Я написал инструмент, который имеет один из лучших "умных белых" форматировщиков. Он дает более читаемый и менее подробный вывод, чем большинство других опций здесь.
Это то, что выглядит "умный белый":
Я могу быть немного предвзятым, но это отличный инструмент для печати и обработки данных JSON из командной строки. Он очень удобен в использовании и имеет обширную справочную/документацию по командной строке. Это нож швейцарской армии, который я использую для 1001 различных небольших задач, которые были бы удивительно раздражающими, чтобы сделать любой другой способ.
Последний вариант использования: консоль Chrome, Dev, вкладка "Сеть", экспортировать все как файл HAR, "cat site.har | underscore select".url --outfmt text | grep mydomain "; теперь у меня есть хронологически упорядоченный список всех URL-адресов, сделанных во время загрузки моего сайта компании.
Довольно печатать легко:
underscore -i data.json print
То же самое:
cat data.json | underscore print
То же самое, более явное:
cat data.json | underscore print --outfmt pretty
Этот инструмент - мой текущий проект страсти, поэтому, если у вас есть какие-либо запросы о функциях, есть хороший шанс, я обращусь к ним.
Обычно я просто делаю:
echo '{"test":1,"test2":2}' | python -mjson.tool
И для извлечения выбранных данных (в этом случае "test" ):
echo '{"test":1,"test2":2}' | python -c 'import sys,json;data=json.loads(sys.stdin.read()); print data["test"]'
Если данные JSON находятся в файле:
python -mjson.tool filename.json
Если вы хотите сделать это за один раз с помощью curl в командной строке, используя токен аутентификации:
curl -X GET -H "Authorization: Token wef4fwef54te4t5teerdfgghrtgdg53" http://testsite/api/ | python -mjson.tool
Благодаря Дж. Ф. Себастьяну очень полезные указатели, здесь немного расширенный script Я придумал:
#!/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))
Это не слишком просто с родным способом с инструментами jq.
Например:
cat xxx | jq .
Если вы используете npm и Node.js, вы можете сделать npm install -g json, а затем выполнить команду через json. Сделайте json -h, чтобы получить все варианты. Он также может вытащить определенные поля и раскрасить результат с помощью -i.
curl -s http://search.twitter.com/search.json?q=node.js | json
On * nix, чтение из stdin и запись в stdout работает лучше:
#!/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)
Поместите это в файл (я назвал свой "prettyJSON" после AnC ответа) в вашем PATH и chmod +x, и вы хорошо перейти.
С Perl используйте модуль CPAN JSON::XS. Он устанавливает инструмент командной строки json_xs.
Validate:
json_xs -t null < myfile.json
Предоставьте JSON файл src.json в pretty.json:
< src.json json_xs > pretty.json
Если у вас нет json_xs, попробуйте json_pp. "pp" для "чистого perl" – инструмент реализован только в Perl, без привязки к внешней библиотеке C (что означает XS, Perl "Extension System" ).
JSON Ruby Gem поставляется с оболочкой script для защиты JSON:
sudo gem install json
echo '{ "foo": "bar" }' | prettify_json.rb
Script скачать: gist.github.com/3738968
 ОБНОВЛЕНИЕ Я использую jq сейчас, как это предлагается в другом ответе. Он чрезвычайно эффективен при фильтрации JSON, но, по своей сути, также является отличным способом печати JSON для просмотра.
jsonpp - очень приятный принтер для командной строки.
Из README:
Довольно распечатать ответы веб-сервисов так:
curl -s -L http://<!---->t.co/tYTq5Pu | jsonppи создайте красивые файлы на вашем диске:
jsonpp data/long_malformed.json
 Если вы работаете в Mac OS X, вы можете brew install jsonpp. Если нет, вы можете просто скопировать двоичный файл куда-нибудь в $PATH.
Что я делаю:
curl yourUri | json_pp
Он сокращает код и выполняет задание.
 Попробуйте  pjson. Он имеет цвета!
 
 Установите его с помощью pip:
 ⚡ pip install pjson
 А затем pjson любой контент JSON в pjson.
простой 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
$ 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 был также удобным для людей, просто use 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"
}
Я использую jshon, чтобы сделать то, что вы описываете. Просто запустите:
echo $COMPACTED_JSON_TEXT | jshon
Вы также можете передавать аргументы для преобразования данных JSON.
Или, с Ruby:
echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'
Отъезд Jazor. Это простой синтаксический анализатор JSON, написанный на Ruby.
gem install jazor
jazor --help
Вы можете использовать эту простую команду для достижения результата:
echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool
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
Просто подайте вывод на jq ..
Пример:
twurl -H ads-api.twitter.com '.......' | jq .
Я совмещаю Python json.tool с pygmentize:
echo '{"foo": "bar"}' | python -m json.tool | pygmentize -g
Есть несколько альтернатив pygmentize, которые перечислены в моем ответе.
Вот живая демонстрация:
С Perl, если вы установите JSON :: PP из CPAN, вы получите команду json_pp. Кража примера из B Bycroft вы получите:
[[email protected] ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
   "bar" : "ipsum",
   "foo" : "lorem"
}
 Стоит отметить, что json_pp поставляется с предустановленной Ubuntu 12.04 (как минимум) и Debian в /usr/bin/json_pp
Я рекомендую использовать утилиту командной строки json_xs, которая включена в модуль JSON:: XS perl. JSON:: XS - это модуль Perl для сериализации/десериализации JSON, на машине Debian или Ubuntu вы можете установить его следующим образом:
sudo apt-get install libjson-xs-perl
Он также доступен на CPAN.
Чтобы использовать его для форматирования JSON, полученного из URL-адреса, вы можете использовать curl или wget следующим образом:
$ curl -s http://page.that.serves.json.com/json/ | json_xs
или это:
$ wget -q -O - http://page.that.serves.json.com/json/ | json_xs
и для форматирования JSON, содержащегося в файле, вы можете сделать это:
$ json_xs < file-full-of.json
Чтобы переформатировать как YAML, которые некоторые люди считают более понятными для человека, чем JSON:
$ json_xs -t yaml < file-full-of.json
brew install jqcommand + | jqcurl localhost:5000/blocks | jq)jj работает очень быстро, может экономно обрабатывать огромные JSON-документы, не работает с действительными числами JSON и прост в использовании, например:
jj -p # for reading from STDIN
или же
jj -p -i input.json
Он (2018) все еще довольно новый, так что, возможно, он не будет обрабатывать некорректный JSON так, как вы ожидаете, но его легко установить на основные платформы.
bat - это клон cat с подсветкой синтаксиса:
Пример:
echo '{"bignum":1e1000}' | bat -p -l json
-p будет выводиться без заголовков, а -l будет явно указывать язык.
Он имеет раскраску и форматирование для JSON и не имеет проблем, отмеченных в этом комментарии: Как мне красиво напечатать JSON в сценарии оболочки?
Установите yajl-инструменты с помощью команды ниже:
 sudo apt-get install yajl-tools
то
 echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat
 yajl очень хорошо, по моему опыту. Я использую команду json_reformat для печати .json файлов в vim, помещая следующую строку в мой .vimrc:
autocmd FileType json setlocal equalprg=json_reformat