Есть ли сценарий оболочки (Unix) для форматирования JSON в удобочитаемой форме?
По сути, я хочу, чтобы он изменил следующее:
{ "foo": "lorem", "bar": "ipsum" }
... примерно так:
{
"foo": "lorem",
"bar": "ipsum"
}
Наткнулся на это, но потом нашел Json Pretty, и он мне очень понравился. Typekit использует его в своих примерах API, поэтому за ним стоит некий klout ^^
Некоторое время назад я откатил свой собственный: github.com/exhuma/braindump/tree/master/jsonformat Код очень простой, с использованием собственной библиотеки json python, но я также добавил пигменты, чтобы получить подсветку синтаксиса.
Если вы не возражаете против копирования и вставки, в Интернете также есть несколько простых инструментов, таких как jsonprettyprint.net, где вы можете быстро распечатать необработанный JSON.
Просто небольшой интересный лакомый кусочек, который может быть очень очевидным, но для тех, кто пытается красиво распечатать файл, содержащий JSON, это работает echo "$(cat nameOfYourFile.js)" | python -m json.tool
Имейте в виду: python -m json.tool не всегда создает допустимый JSON. (Подсказка: 1e1000)
JSON только на один уровень? Это исключает решения на основе регулярных выражений в случае отрицательного ответа.
У кого-нибудь есть удобный способ распечатать файл JSON на месте?
@LarsH вот интерактивный просмотрщик JSON github.com/antonmedv/fx
Слишком много (одинаковых) ответов, сложно найти список возможных решений. Я сделал тест, чтобы попытаться обобщить эти. Надеюсь, это не будет очередным бесполезным ответом!
Если вы хотите отформатировать свой json в виде таблицы, вы можете использовать jtab, инструмент, написанный на ржавчине, который позволяет вам это сделать: github.com/wlezzar/jtab

Есть TidyJSON.
Это C#, так что, возможно, вы сможете скомпилировать его с помощью Мононуклеоз и поработать над * nix. Но никаких гарантий, извините.
$ 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"
}
Если оставшаяся часть вашего конвейера будет изящно обрабатывать Unicode, и вы хотите, чтобы ваш 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"
}
на самом деле я делаю то же самое, но с самим javascript :)
В имеющейся у меня версии модуля JSON to_json, похоже, не принимает параметры. Но это работает: perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
Пример Python можно упростить. Намного проще направить вывод JSON прямо в python -m json.tool.
@ Дэн: да. И есть несколько ответов, которые показывают примеры кода json.tool. 1. эта версия позволяет изменять некоторые параметры, например, indent 2. На момент публикации (2008 г.) Python 2.4 все еще использовался который не поддерживает -mjson.tool
Благодаря очень полезным указателям Дж. Ф. Себастьяна, вот немного улучшенный сценарий, который я придумал:
#!/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))
Когда значения загружаются в словарь, порядок теряется: обычные объекты dict не имеют определенного порядка. Попробуйте json.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False), и вы все равно обнаружите, что они поменяны местами. Чтобы исправить это, импортируйте OrderedDict и load, передав object_pairs_hook=OrderedDict.
Вы можете изменить сценарий для чтения со стандартного ввода с помощью этого: inputFile = sys.stdin. Это позволяет передавать данные в сценарий следующим образом: curl http://somewhere.com/foo.json | pp_json.py
И чтобы избежать сортировки с комментарием @ icktoofay, импортируйте OrderedDict следующим образом: from collections import OrderedDict.
Спасибо @icktoofay. Это позволило мне создать следующую функцию vim: 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=(',', ': '))" Обратите внимание, что разделители должны быть установлены как (',', ':'), чтобы избежать добавления конечных пробелов: bugs.python.org/issue16333
Отличный сниппет! Вместо этого я использовал sort_keys = True, потому что я хочу использовать его для сравнения файлов json, и он работает как шарм.
Решения J.F. Sebastian у меня не работали в Ubuntu 8.04.
Вот модифицированная версия Perl, которая работает со старой библиотекой JSON 1.X:
perl -0007 -MJSON -ne 'print objToJson(jsonToObj($_, {allow_nonref=>1}), {pretty=>1}), "\n";'
На * 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, и все готово.
Действительно, использование stdin / stdout намного более гибкое и простое. Спасибо, что указали на это.
Для программ, которые ожидают именованный файл, используйте / dev / stdin, то же самое для out и err.
FYI fileinput.input() читает из stdin, если в командной строке нет файлов. Пример
fileinput.input () не может хорошо работать с файлами без новой строки в конце, когда я в последний раз проверял.
- спросил он в сценарии оболочки, а не на другом языке Python. С JQ это можно сделать на отлично.
Или с Ruby:
echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'
Это дает мне ошибку. Вам нужен какой-нибудь пакет ruby json?
Да, вам нужен JSON Ruby Gem: sudo gem install json
@MatSchaffer Обратите внимание, что это не работает, если вы используете JSON для сериализации объектов с помощью пользовательских методов to_json; Kernel#jj печатает только массивы и хэши одного и того же (или чисел / строк / логических значений).
В Windows попробуйте это: echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
С 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"}'.
Обратите внимание, что, как указывает @pnd в комментариях ниже, в Python 3.5+ объект JSON больше не сортируется по умолчанию. Для сортировки добавьте в конец флаг --sort-keys. Т.е. ... | python -m json.tool --sort-keys.
С другими версиями Python вы можете установить simplejson и использовать python -msimplejson.tool
Вы можете перенаправить это на pygmentize -l javascript, чтобы получить вывод в командной строке с цветным синтаксисом. Редактировать: если у вас установлены пигменты, то есть.
псевдоним ppj = 'python -mjson.tool'; echo '{"foo": "lorem", "bar": "ipsum"}' | ppj
Отличный ответ, единственное предостережение, которое у меня есть, это то, что делает сортирует ключи на выходе - о чем вам, возможно, нужно знать.
В myy .vimrc "nnoremap <f5>:%! Python -m json.tool <CR>: w <CR>"
Кажется, что это позволяет избежать символов Unicode в \ uXXXX, что может быть недостатком.
Этот совет очень удобен при просмотре выходных данных Riak или (других серверов с поддержкой JSON)! например curl blah.com:8089 | python -mjson.tool Вам абсолютно не нужно ничего устанавливать или настраивать, кроме python, который обычно уже есть.
Эй, может ли кто-нибудь помочь с добавлением этой внешней команды в gedit? Обновлено: понял; Инструменты -> Управление внешним Toosl -> новый (+) -> добавить «python -mjson.tool» -> Выбрать Вход = Текущий документ, Выход = Заменить текущий документ. Ваше здоровье!
У кого-нибудь есть то же самое для XML?
@MikeWeller stackoverflow.com/questions/16090869/…
и добавьте подсветку синтаксиса, направив вывод в 'colout -t json'. Сначала требуется "pip install colout".
@ user1071136 Чтобы сохранить символы Unicode в выводе, необходимо создать свой собственный сценарий. import sys import json j = json.load (sys.stdin) json.dump (j, sys.stdout, sure_ascii = False, sort_keys = True, indent = 4, separators = (',', ':'))
Он не принимает массивы верхнего уровня, поэтому, к сожалению, не все json.
@ShrikantSharat: начиная с версии 1.5 Pygments также поддерживают тип json.
Я создал псевдоним: alias pretty='python -mjson.tool | pygmentize -l json, чтобы просто запустить: command params | pretty. Надеюсь это поможет. PS: Если кому-то удастся расширить это до а) удалить curl-output, который я вижу каждый раз, и / или б) НЕ сортировать ключи json; пожалуйста, дайте мне знать, я буду очень благодарен.
И если JSON находится в файле: $ cat file.json | python -m json.tool
Другая проблема с python -m json.tool как красивым принтером JSON заключается в том, что он не всегда печатает допустимые значения JSON. Например. 1e1000 преобразуется в бесконечность.
python не поддерживает не-ascii
Изменено в Python 3.5: теперь вывод в том же порядке, что и ввод. Используйте --sort-keys для сортировки ключей по алфавиту. В ответ на комментарий @ChrisNash.
Если вы используете macOS и у вас есть json в буфере обмена, который вы хотите отформатировать в pbpaste | python -m json.tool | pbcopy.
Удивительный! Спасибо, что поделились этим. Кроме того, если вы передали параметр «-i» для cURL, он не сможет правильно распечатать json, поскольку теперь у вас также есть заголовки HTTP.
Что, если я захочу записать его в cat с помощью python -m json.tool /path.json?
Есть ли способ лучше отформатировать скобки? (Используйте тот же столбец для левой скобки и соответствующей правой скобки)
@ClintEastwood - параметр curl -s подавляет вывод, например curl -s http://my_url/ | python -m json.tool Нужно просто распечатать JSON.
Это просто ответ на вопрос, как это сделать в Python или в Интернете. Буква вопроса кажется удовлетворительной, но я не думаю, что он был полностью удовлетворен духом. 3551 голос "за" кажутся чрезмерной реакцией.
какой модуль требуется установить? Я получаю: / usr / bin / python: No module named json.module
@ClintEastwood Чтобы подавить отчет / полоску прогресса curl, просто передайте флаг молчания: curl -s
это самый высокий непринятый ответ за все время
Методика из этого ответа для всех файлов .json в вашем текущем каталоге: for file in *.json; do python -m json.tool $file > ${file/.json/.pretty.json}; done
json.tool плохо работает с большими файлами. Где-то там есть fp.read(), читающий весь файл JSON.
JSON Ruby Gem поставляется со сценарием оболочки для предварительной настройки JSON:
sudo gem install json
echo '{ "foo": "bar" }' | prettify_json.rb
Скачивание скрипта: gist.github.com/3738968
Обратите внимание, что это решение декодирует escape-последовательности Unicode «\ uxxxx», в отличие от Python с json.tool. Однако, похоже, он также имеет ограничения по глубине вложенности (nesting of 20 is too deep (JSON::NestingError)).
в Ubuntu вы можете: sudo apt-get install ruby-json-pure вместо gem install
`` eric-mbp: ~ ericstob $ sudo gem install json Пароль: Получение: json-1.7.3.gem (100%) Создание собственных расширений. Это может занять некоторое время ... Успешно установлен json-1.7.3 1 gem установлен Установка документации ri для json-1.7.3 ... Установка документации RDoc для json-1.7.3 ... eric-mbp: ~ ericstob $ prettify_json .rb -bash: prettify_json.rb: команда не найдена
может вы могли бы выложить содержимое вашего prettify_json.rb?
Вы можете загрузить скрипт, переместить его в папку ~/bin (убедитесь, что он находится в вашем PATH), переименуйте prettify_json.rb в ppj и запустите chmod +x ppj. Теперь можно сделать что-то вроде curl www.jsonsring.com/something.json | ppj
prettify_json.rb поставляется с Ruby 1.9 и новее.
В Perl используйте CPAN-модуль JSON::XS. Он устанавливает инструмент командной строки json_xs.
Подтвердить:
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 «Система расширений»).
Кажется, входит в стандартную комплектацию Cygwin!
Таким же образом можно использовать json_pp, и, скорее всего, он будет легко установлен в вашей системе (в Debian он находится в пакете perl).
К вашему сведению, в моей системе Mac OS X 10.9 json_pp доступен автоматически.
-t null дал мне null: недопустимый формат ... но его отключение отлично сработало. Спасибо.
pp предназначен для чистого perl, а не для печати здесь :) Поскольку json_xs и json_pp могут делать больше, чем просто красивую печать, а также с -json_opt делать другие вещи вместо красивой печати. Хотя по умолчанию используется красивая печать.
json_xs и json_pp не сохраняют порядок ключей и не сортируют ключи. Если дважды напечатать один и тот же файл JSON, это может привести к разным результатам. (Протестировано с perl-5.26.1-6 и libjson-xs-perl-3.040-1 в Ubuntu 18.04.)
Я использую аргумент «пробел» в 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.info(JSON.stringify(JSON.parse(process.argv[1]), null, '\t'));" \
'{"foo":"lorem","bar":"ipsum"}'
Возврат:
{
"foo": "lorem",
"bar": "ipsum"
}
Из командной строки Unix с помощью Node.js, указав имя файла, содержащее JSON, и используя отступ в четыре пробела:
$ node -e "console.info(JSON.stringify(JSON.parse(require('fs') \
.readFileSync(process.argv[1])), null, 4));" filename.json
Используя трубу:
echo '{"foo": "lorem", "bar": "ipsum"}' | node -e \
"\
s=process.openStdin();\
d=[];\
s.on('data',function(c){\
d.push(c);\
});\
s.on('end',function(){\
console.info(JSON.stringify(JSON.parse(d.join('')),null,2));\
});\
"
Для отладки объектов в Node.js вам действительно следует использовать sys.inspect () вместо JSON.stringify (). И вот почему: markhansen.co.nz/inspecting-with-json-stringify
Проголосовали против. OP - это «сценарий командной строки * nix», и этот ответ представляет собой другой контекст.
@danorton: JS можно использовать из командной строки через node.js и другие подобные решения.
Используйте node -e "console.info(JSON.stringify(JSON.parse(process.argv[1]), null, '\t'));" в командной строке Unix (с nodejs)
узел -e 'var f = require ("./ package.json"); console.info (имя_файлы); ' Еще короче: D: D: D
Консоль не нужна: node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');" также выводит результат в STDOUT.
JSON.stringify я всегда использую
Отстойно, что сценарий отличается для имени файла и stdin
@LukaszWiktor этого не должно быть, если ваш * nix поддерживает /dev/stdin!
Проверьте Jazor. Это простой синтаксический анализатор JSON из командной строки, написанный на Ruby.
gem install jazor
jazor --help
Это только я или это единственное предложение, которое на самом деле отвечает на вопрос ОП? Я пришел сюда в поисках простой команды, в которую я мог бы передать вывод curl, и это единственная команда, которая сделала это за меня.
Мне нравится, что у него есть возможность раскрасить вывод. Облегчает чтение.
ooh Мне также нравится возможность передать URL-адрес, так как я использую его для просмотра вывода моего REST API
Если вы используете npm и Node.js, вы можете выполнить npm install -g json, а затем передать команду через json. Сделайте json -h, чтобы получить все варианты. Он также может извлекать определенные поля и раскрашивать вывод с помощью -i.
curl -s http://search.twitter.com/search.json?q=node.js | json
Я рекомендую использовать утилиту командной строки json_xs, которая включена в модуль Perl JSON :: XS. 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
$ sudo apt-get install edit-json
$ prettify_json myfile.json
Я использую jshon, чтобы делать именно то, что вы описываете. Просто беги:
echo $COMPACTED_JSON_TEXT | jshon
Вы также можете передавать аргументы для преобразования данных JSON.
Спасибо, jshon намного быстрее, чем использование python или ruby для той же задачи.
@Alexander - Как быстро тебе нужен красивый принтер? Я использую OSx Lion с предустановленным Python. С помощью python -mjson.tool я могу распечатать json-файл размером 96 КБ за 0,1 с - json-вывод earthporn, на который ссылается jshon, составляет около 24 КБ, и я могу распечатать его за 0,08 с. Насколько быстрее для вас jshon?
Я работаю со сжатыми файлами данных JSON размером 1 + ГБ (кто даже знает, насколько велик несжатый), поэтому я очень ценю предложение о том, что jshon работает быстрее.
В Perl, если вы устанавливаете JSON :: PP из CPAN, вы получите команду json_pp. Украдя пример у Б. Байкрофт, вы получите:
[pdurbin@beamish ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
"bar" : "ipsum",
"foo" : "lorem"
}
Стоит отметить, что json_pp предустановлен с Ubuntu 12.04 (как минимум) и Debian в /usr/bin/json_pp.
Обычно я просто делаю:
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
если предполагается, что json поступает непосредственно из http api, это также хороший инструмент, реализованный на python: github.com/jkbr/httpie
Если у вас установлен узел (и вы не возражаете против вывода стиля YAML), есть также этот пакет: rafeca.com/prettyjson, чтобы вы могли завершить завиток с помощью | prettyjson
Как отмечалось выше, одна из проблем с python -mjson.tool как красивым принтером JSON заключается в том, что он не всегда генерирует JSON. Например. 1e1000 становится Infinity (независимо от того, используется ли Python 2.x или 3.x). 'jq.' всегда создает JSON, но не гарантирует, что очень большие (или очень маленькие значения) сохранятся точно.
Вот как это сделать с помощью скрипта Groovy.
Создайте сценарий Groovy, скажем, "довольно-таки".
#!/usr/bin/env groovy
import groovy.json.JsonOutput
System.in.withReader { println JsonOutput.prettyPrint(it.readLine()) }
Сделать скрипт исполняемым:
chmod +x pretty-print
Теперь из командной строки
echo '{"foo": "lorem", "bar": "ipsum"}' | ./pretty-print
Как бы мне ни нравился Groovy, он не очень подходит для таких небольших скриптов из-за накладных расходов на JVM. Мои неофициальные измерения показывают, что jq примерно в 50 раз быстрее.
Я автор json-лайнер. Это инструмент командной строки для преобразования JSON в формат, удобный для grep. Попробуйте.
$ echo '{"a": 1, "b": 2}' | json-liner
/%a 1
/%b 2
$ echo '["foo", "bar", "baz"]' | json-liner
/@0 foo
/@1 bar
/@2 baz
С помощью JavaScript / Node.js: взгляните на плагин vkBeautify.js, который обеспечивает удобную печать как для текста JSON, так и для XML.
Он написан на простом JavaScript, менее 1,5 KB (минифицированный) и очень быстрый.
Мои файлы JSON не анализировались ни одним из этих методов.
Моя проблема была похожа на сообщение JSON источника данных Google недействителен?.
Ответ на этот пост помог мне найти решение.
Считается недействительным JSON без строковых ключей.
{id:'name',label:'Name',type:'string'}
должно быть:
{"id": "name", "label": "Name", "type": "string"}
Эта ссылка дает хорошее исчерпывающее сравнение некоторых различных парсеров JSON: http://deron.meranda.us/python/comparing_json_modules/basic
Что привело меня к http://deron.meranda.us/python/demjson/. Я думаю, что этот парсер гораздо более отказоустойчив, чем многие другие.
JSON не допускает использование одинарных кавычек в качестве разделителей, и нормальный синтаксический анализатор JSON должен отклонять такой ввод.
Последние две ссылки кажутся неработающими ("Сервер на deron.meranda.us слишком долго отвечает").
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
Я рекомендую не устанавливать зависимости nodejs / npm глобально => Вместо этого я бы использовал npx: curl -s "http://api.twitter.com/1/users/show/user.json" | npx jsonlint | less (т.е. npm install не требуется)
Я написал инструмент, в котором есть один из лучших доступных форматеров «умных пробелов». Он дает более читаемый и менее подробный вывод, чем большинство других вариантов здесь.
Вот как выглядит "умный пробел":
Я могу быть немного предвзятым, но это отличный инструмент для печати и управления данными JSON из командной строки. Он очень удобен в использовании и имеет обширную справочную / документацию командной строки. Это швейцарский армейский нож, который я использую для выполнения 1001 различных небольших задач, выполнение которых было бы на удивление неудобно.
Последний вариант использования: Chrome, консоль разработчика, вкладка «Сеть», экспорт всего в виде файла 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
Этот инструмент - мой текущий увлеченный проект, поэтому, если у вас есть какие-либо пожелания по функциям, есть большая вероятность, что я их рассмотрю.
Я также обновил свой ~ / .bash_profile, добавив в него следующую строку: alias underscor = 'underscore print --outfmt pretty', теперь я могу просто выполнить curl example.com/result.json | подчеркивание и по-прежнему использовать подчеркивание для другого форматирования
Спасибо, Дэйв! Инструмент хороший! псевдоним pretty-json = "underrsore pretty" и скручивающий вывод, радующий глаз
Отличный инструмент форматирования, только одно замечание: пересылка вывода в файл (либо с параметром -о, либо с параметром >) работает только с подчеркивание печати. подчеркнуть красиво сохраняет файл со вставленными знаками цветового форматирования, например: [32m, [33m, [39m, вместе с некоторыми непечатаемыми перед каждым из них, что делает JSON недействительным. Однако сам по себе подчеркивание печати ничего не добавляет к файлу и отлично выполняет свою работу по форматированию.
Мне нравится jq, но это отлично сработало для моего "JSON", у которого не было ключей в двойных кавычках.
@DaveDopson спасибо за отличный инструмент !! Попробую использовать его вместе с jsonselect.org/#tryit ...
Кроме того, с помощью npm (используйте creationix / nvm :) для установки, потому что он должен быть глобальным: npm install -g underscore-cli ... затем в .bash_profile: alias json = 'underscore print --color' ... и используйте вроде: cat some.json | json Underscore-CLI действительно великолепен и легко интегрируется в вашу среду разработки.
Я знаю, что исходный пост запрашивал сценарий оболочки, но есть так много полезных и нерелевантных ответов, которые, вероятно, не помогли первоначальному автору. Добавляем к неактуальности :)
Кстати, я не мог заставить работать какие-либо инструменты командной строки.
Если кому-то нужен простой код JSON JavaScript, они могут:
JSON.stringfy(JSON.parse(str), null, 4)
http://www.geospaces.org/geoweb/Wiki.jsp?page=JSON%20Utilities%20Demos
Вот код JavaScript, который не только украшает JSON, но и упорядочивает их по атрибуту или по атрибуту и уровню.
Если ввод
{ "c": 1, "a": {"b1": 2, "a1":1 }, "b": 1},
он либо печатает (группирует все объекты вместе):
{
"b": 1,
"c": 1,
"a": {
"a1": 1,
"b1": 2
}
}
ИЛИ (просто заказы по ключу):
{
"a": {
"a1": 1,
"b1": 2
},
"b": 1,
"c": 1
}
Установите yajl-tools с помощью следующей команды:
sudo apt-get install yajl-tools
потом,
echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat
Потрясающие. Не требует другого языка / интерпретатора и находится в репозитории пакетов, варить не нужно!
Попробуйте pjson. В нем есть цвета!

Установите его с помощью pip:
⚡ pip install pjson
А затем передайте все содержимое JSON в pjson.
Для этого требуется python-pip (sudo apt-get install python-pip), а затем (sudo pip install pjson) Большим преимуществом являются цвета!
Недостатком является невозможность вывода цветного вывода с помощью grep.
Он очень прост в использовании и отлично работает! Он может обрабатывать очень большие структуры JSON, включая потоки. Ты можешь найти их учебники здесь.
Примеры использования:
$ 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"
}
Или используйте jq с фильтром идентификации:
$ jq '.foo' <<< '{ "foo": "lorem", "bar": "ipsum" }'
"lorem"
Также есть опция --sort-keys, которая в некоторых случаях бывает полезна.
jq - отличный инструмент, о котором я узнал благодаря этому ответу. Однако имейте в виду, что для работы требуются целые объекты. Он не начнет выводить результаты, пока не прочитает весь входной объект.
Работа с curl: curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
"jq." хорош как красивый принтер, но с оговоркой: jq (до jq версии 1.5 включительно) будет изменять значения очень больших и очень маленьких чисел, потому что он анализирует числовые значения как 64-битные значения IEEE 754. Чтобы проверить, есть ли у вашего любимого красивого принтера такая же проблема, попробуйте это значение: 1e1000. Обратите внимание, что python -mjson.tool плохо проходит этот тест, поскольку он создает Infinity, которая даже не является JSON.
В качестве примечания, вы можете перенаправить отформатированный результат в файл: echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfile.
@Meekohi альтернатива - "ненужное использование эха". Очень рад, что нашел оператора <<< - именно то, что я искал.
Вот хороший список возможностей jq, включая раздел, посвященный красивой печати: shapehed.com/jq-json/#how-to-pretty-print-json. Один из способов записать ваш уродливый файл в красивый: cat ugly.json | jq '.' | cat > pretty.json
Ввод cat | jq . и затем вставка работали. Похоже, больше нет ... jq просто выходит по какой-то причине. Теперь я использую псевдоним вставки из буфера обмена: clipread | jq. Псевдоним - alias clipread='xclip -out -selection clipboard' (добавьте его в свой ~/.bashrc, zshrc или любой другой-rc и выберите псевдоним, который вам нравится).
Чтение из файла jq . <<< cat filename.json
jq лучший, потому что печатает в цветах!
@Luc. Попробуйте cat - | jq . с вставленным текстом. Всем удачи.
jq -C для включения цветов. Если вы передаете вывод на less, затем на export LESS = "-R", а затем используйте jq -C ... | less. Без -Cjq подавляет цвета, когда вывод не направляется на терминал, как в | command или > file.
У jq есть раздражающее свойство, заключающееся в том, что он незаметно теряет точность чисел. Например. если в вашем вводе есть "foo": 16962331779841739123, то jq '.' будет молча округлять число до "foo": 16962331779841739000. Если я ищу только красивый принтер, то я бы выбрал тот, который не с потерями.
+1, в отличие от решения python, jq также обрабатывает некоторые неправильно отформатированные данные (например, файлы резервных копий NVR Ubiquiti), например: echo '{"foo":0}{"bar":1}' | jq, где python подавляется отсутствующей запятой и не дает отформатированного вывода.
echo '{"value": 1e1000}' | fx .valueПочему, черт возьми, на странице 2 скрыто более 1000 голосов за этот ответ? jq на сегодняшний день является одним из лучших инструментов для работы. Stack Overflow необходимо улучшить алгоритм сортировки ответов.
Версия PHP, если у вас PHP> = 5.4.
alias prettify_json=php -E '$o = json_decode($argn); print json_encode($o, JSON_PRETTY_PRINT);'
echo '{"a":1,"b":2}' | prettify_json
Один лайнер: echo '{"a":1,"b":2}' | php -r 'echo json_encode(json_decode(fgets(STDIN)), JSON_PRETTY_PRINT)."\n";'
Поддержка нескольких линий: printf '{\n"a":1,\n"b":2\n}' | php -r 'echo json_encode(json_decode(file_get_contents("php://stdin")), JSON_PRETTY_PRINT) . PHP_EOL;'
ОБНОВИТЬ Сейчас я использую jq, как предлагается в другом ответе. Он чрезвычайно эффективен при фильтрации JSON, но, по сути, это также отличный способ распечатать JSON для просмотра.
jsonpp - очень красивый JSON-принтер для командной строки.
Из README:
Pretty print web service responses like so:
curl -s -L http://<!---->t.co/tYTq5Pu | jsonppand make beautiful the files running around on your disk:
jsonpp data/long_malformed.json
Если у вас Mac OS X, вы можете brew install jsonpp. Если нет, вы можете просто скопировать двоичный файл куда-нибудь на свой $PATH.
Я попробовал jsonpp (успешно использовался в прошлом) с огромным файлом (> 60 МБ). Я остановил это через 5мин. Я подключил его к python -mjson.tool (из другого ответа здесь), и это заняло 10-20 секунд ...
60 МБ JSON? Ух ты! Обычно я не работаю с такими большими, но полезными файлами. Спасибо.
В моем ящике ubuntu у меня есть json_pp, который прекрасно форматирует json, хотя, несмотря на схожесть имен, я считаю, что это совершенно другой проект, чем упомянутый здесь jsonpp.
Вот решение Ruby, которое лучше команды prettify Json. Самоцвет colorful_json неплох.
gem install colorful_json
echo '{"foo": "lorem", "bar": "ipsum"}' | cjson
{
"foo": "lorem",
"bar": "ipsum"
}
Вот однострочник Groovy:
echo '{"foo": "lorem", "bar": "ipsum"}' | groovy -e 'import groovy.json.*; println JsonOutput.prettyPrint(System.in.text)'
Вместо этого вы также можете использовать онлайн-инструменты, если это для вас вариант.
Я считаю http://jsonprettyprint.net самым простым и легким.
Я использую httpie
$ pip install httpie
И вы можете использовать это так
$ http PUT localhost:8001/api/v1/ports/my
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 93
Content-Type: application/json
Date: Fri, 06 Mar 2015 02:46:41 GMT
Server: nginx/1.4.6 (Ubuntu)
X-Powered-By: HHVM/3.5.1
{
"data": [],
"message": "Failed to manage ports in 'my'. Request body is empty",
"success": false
}
Я комбинирую Python json.tool с pygmentize:
echo '{"foo": "bar"}' | python -m json.tool | pygmentize -g
Есть несколько альтернатив pygmentize, которые перечислены в мой этот ответ.
Вот живая демонстрация:
Иногда для окрашивания необходимо использовать pygmentize -l json.
Установить с помощью пакета apt python-pygments, то есть apt-get install python-pygments
Для Node.js вы также можете использовать модуль «util». Он использует подсветку синтаксиса, интеллектуальные отступы, удаляет кавычки из ключей и просто делает вывод максимально красивым.
cat file.json | node -e "process.stdin.pipe(new require('stream').Writable({write: chunk => {console.info(require('util').inspect(JSON.parse(chunk), {depth: null, colors: true}))}}))"
gem install jsonpretty
echo '{"foo": "lorem", "bar": "ipsum"}' | jsonpretty
Этот метод тоже «Обнаруживает HTTP-ответ / заголовки, печатает их нетронутыми и переходит к тело (для использования с curl -i)».
простой сценарий 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
Спасибо за ответ. Я написал этот сценарий только сегодня для личного использования, и в моих случаях он отлично работал. Внес исправления, теперь меньше и без этой проблемы. Нет цели полностью поддерживать формат, но при необходимости я могу внести другие исправления.
Это единственный рабочий ответ, который я нашел. У меня есть встроенный Linux - без мусора, без javascript, без доступа к Интернету для загрузки модулей Python ... У меня немного другой awk, который не поддерживает нотацию %*c, поэтому я заменил printf на c=0; while (c++<offset) printf " "; printf $0;. И мой awk имеет другое экранирование регулярных выражений, а обратная косая черта не работает в []. Я изменил регулярные выражения на /^[[{]/ и /[]}]/.
Это должно быть принято, поскольку оно полностью родное и не требует стороннего программного обеспечения ...
@Blag, скрипт выглядел сломанным после вашего редактирования, объясните или исправьте это. Благодарность!
@EvgenyKarpov приятный улов, полный откат не нужен, только grep, который по ошибке стерли;)
Этот сценарий довольно хрупкий и не поддерживает полный синтаксис json. Например, он превращает { "\"" : "quote" } в { "\" " : " } (на нескольких строках).
Это очень хорошо работает с трубопроводом. getMyLogs | grep -Eo ...
Спасибо, чувак, мне нужен был быстрый способ отформатировать 8-мегабайтный однострочный json-файл с помощью простого bash.
В моем случае мне также нужно было выполнить json_pretty.sh, например cat file.json | ./json_pretty.sh
Лучшее решение, если у вас есть автономный скрипт и вы не хотите заставлять кого-то устанавливать Homebrew, python, ruby, node.js ...
Инструмент ydump - это симпатичный принтер JSON:
$ ydump my_data.json
{
"foo": "lorem",
"bar": "ipsum"
}
Или вы можете передать JSON:
$ echo '{"foo": "lorem", "bar": "ipsum"}' | ydump
{
"foo": "lorem",
"bar": "ipsum"
}
Это, вероятно, самое короткое решение помимо использования инструмента jq.
Этот инструмент является частью библиотеки yojson для OCaml и документирован как здесь.
В Debian и производных пакет libyojson-ocaml-dev содержит этот инструмент. Как вариант, yojson можно установить через OPAM.
Просто направьте вывод на jq ..
Пример:
twurl -H ads-api.twitter.com '.......' | jq .
Хороший ответ @Ackshaey Singh, и его можно легко перенаправить в файл. например cat <file_name.txt> | jq . > <output_name.txt>
brew install jq, если у вас Mac OS.
К сожалению, использование jq . для красивой печати имеет один недостаток потенциал: все существующие версии jq настаивают на обработке чисел JSON как чисел IEEE, поэтому точность легко теряется, например для очень больших целых чисел.
@Pramit cat file | неизменно является пустой тратой процесса; просто сделайте jq . <file_name.txt >output_name.txt (с буквальными символами < и >).
Если вы не против использования стороннего инструмента, вы можете просто от завиток до jsonprettyprint.org. Это для случая, когда вы не можете установить пакеты на машину.
curl -XPOST https://jsonprettyprint.org/api -d '{"user" : 1}'
Чтобы передать stdin этой команде, сделайте что-то вроде этого: echo '{ "foo": "lorem", "bar": "ipsum" }' | curl -XPOST https://jsonprettyprint.org/api -d @-
Также не забудьте проверить JSONFUI: средство просмотра JSON командной строки, поддерживающее сворачивание
Если у вас установлен Node.js, вы можете создать его самостоятельно с помощью одной строчки кода. Создайте красивый файл:
> vim pretty
#!/usr/bin/env node
console.info(JSON.stringify(JSON.parse(process.argv[2]), null, 2));
Добавить разрешение на выполнение:
> chmod +x pretty
> ./pretty '{"foo": "lorem", "bar": "ipsum"}'
Или, если ваш JSON находится в файле:
#!/usr/bin/env node
console.info(JSON.stringify(require("./" + process.argv[2]), null, 2));
> ./pretty file.json
process.stdin.resume (); var input = ''; process.stdin.on ('данные', (данные) => {ввод + = данные;}); process.stdin.on ('конец', () => {console.info (JSON.stringify (JSON.parse (ввод), null, 2));});
Вот как я это делаю:
curl yourUri | json_pp
Это сокращает код и выполняет свою работу.
Сервер Ubuntu: если у вас есть производственные машины с очень ограниченными установками, это может быть лучшим выбором, поскольку он устанавливается по умолчанию под определенным именем. Python часто устанавливается по-разному (например, python3, python или не устанавливается вообще) в зависимости от версии.
https://github.com/aidanmelen/json_pretty_print
from __future__ import unicode_literals
from __future__ import absolute_import
from __future__ import print_function
from __future__ import division
import json
import jsonschema
def _validate(data):
schema = {"$schema": "http://json-schema.org/draft-04/schema#"}
try:
jsonschema.validate(data, schema,
format_checker=jsonschema.FormatChecker())
except jsonschema.exceptions.ValidationError as ve:
sys.stderr.write("Whoops, the data you provided does not seem to be " \
"valid JSON.\n{}".format(ve))
def pprint(data, python_obj=False, **kwargs):
_validate(data)
kwargs["indent"] = kwargs.get("indent", 4)
pretty_data = json.dumps(data, **kwargs)
if python_obj:
print(pretty_data)
else:
repls = (("u'",'"'),
("'",'"'),
("None",'null'),
("True",'true'),
("False",'false'))
print(reduce(lambda a, kv: a.replace(*kv), repls, pretty_data))
С родным способом с инструменты jq не все так просто.
Например:
cat xxx | jq .
ВНИМАНИЕ: jq кодирует числа как 64-битные числа с плавающей запятой IEEE 754, поэтому их представление может измениться. Вероятно, будет потеряна точность очень маленьких и очень больших чисел. Чтобы проверить, есть ли у вашего любимого красивого принтера такая же проблема, попробуйте это значение: 1e1000.
или просто: jq . file.json; но и cat file.json | jq (без фильтра .) тоже работает. (на ubuntu / linux; ymmv на разных платформах)
Используйте Ruby в одну строку:
echo '{"test":1,"test2":2}' | ruby -e "require 'json'; puts JSON.pretty_generate(JSON.parse(STDIN.read))"
И вы можете установить для этого псевдоним:
alias to_j = "ruby -e \"require 'json';puts JSON.pretty_generate(JSON.parse(STDIN.read))\""
Тогда вы сможете использовать его более удобно
echo '{"test":1,"test2":2}' | to_j
{
"test": 1,
"test2": 2
}
И если вы хотите отображать JSON с цветом, вы можете установить awesome_print,
gem install awesome_print
тогда
alias to_j = "ruby -e \"require 'json';require 'awesome_print';ap JSON.parse(STDIN.read)\""
Попробуй это!
echo '{"test":1,"test2":2, "arr":["aa","bb","cc"] }' | to_j
jj сверхбыстрый, может экономично обрабатывать огромные документы JSON, не мешает действительным номерам JSON и прост в использовании, например
jj -p # for reading from STDIN
или же
jj -p -i input.json
Он (2018) все еще довольно новый, поэтому, возможно, он не будет обрабатывать недопустимый JSON так, как вы ожидаете, но его легко установить на основных платформах.
Вы можете использовать эту простую команду для достижения результата:
echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool
На мой взгляд, лучший ответ. Компактный, легко запоминающийся, не требует установки каких-либо нестандартных инструментов.
python -m json.tool, похоже, не сохраняет порядок объекта JSON.
Он выполняет сортировку в python 2, в 3 он не сортирует github.com/python/cpython/blob/3.8/Lib/json/tool.py
bat - это клон cat с подсветкой синтаксиса:
Пример:
echo '{"bignum":1e1000}' | bat -p -l json
-p будет выводить без заголовков, а -l явно укажет язык.
Он имеет раскраску и форматирование для JSON, и есть ли у нет проблемы, отмеченные в этом комментарии: Как я могу красиво распечатать JSON в сценарии оболочки?
Однострочное решение с использованием Node.js будет выглядеть так:
$ node -e "console.info( JSON.stringify( JSON.parse(require('fs').readFileSync(0) ), 0, 1 ))"
Например:
$ cat test.json | node -e "console.info( JSON.stringify( JSON.parse(require('fs').readFileSync(0) ), 0, 1 ))"
для меня нет вывода с этим примером, хотя я проголосовал за это давным-давно. Что-то изменилось ...
@MatthisKohli: Я только что перепроверил это на Node V12.x, и он работает. В этом коде нет ничего волшебного. fs.readFileSync(0) читает stdin текущего процесса, а JSON.stringify форматирует JSON. Таким образом, вероятность поломки при смене API очень мала.
Вы можете использовать Сидель.
Xidel is a command line tool to download and extract data from HTML/XML pages or JSON-APIs, using CSS, XPath 3.0, XQuery 3.0, JSONiq or pattern templates. It can also create new or transformed XML/HTML/JSON documents.
По умолчанию Xidel красиво печатает:
$ xidel -s - -e '$json' <<< '{"foo":"lorem","bar":"ipsum"}'
{
"foo": "lorem",
"bar": "ipsum"
}
или же:
$ echo '{"foo":"lorem","bar":"ipsum"}' | xidel -s - -e .
{
"foo": "lorem",
"bar": "ipsum"
}
Вы можете просто использовать стандартные инструменты, такие как jq или json_pp.
echo '{ "foo": "lorem", "bar": "ipsum" }' | json_pp
или же
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq
оба преобразуют вывод, как показано ниже (jq еще более красочен):
{
"foo": "lorem",
"bar": "ipsum"
}
Огромным преимуществом jq является то, что он может делать НАМНОГО больше, если вы хотите анализировать и обрабатывать json.
json_pp был на моем Mac, но не jq. Спасибо!
@DavidH - помогает ли это: stackoverflow.com/questions/37668134/…
TL; DR: для выступлений используйте jj -p < my.json.
Я взял здесь несколько решений и протестировал их с помощью следующего фиктивного скрипта:
function bench {
time (
for i in {1..100}; do
echo '{ "foo": "lorem", "bar": "ipsum" }' | $@ > /dev/null
done
)
}
Вот результат на моем Mac (8 ГБ 2133 МГц LPDDR3, 2,3 ГГц Intel Core i5):
bench python -m json.tool
# 3.60s user 1.24s system 88% cpu 5.448 total
bench jq
# 2.79s user 0.29s system 89% cpu 3.453 total
bench bat -p -l json
# 5.77s user 0.99s system 95% cpu 7.080 total
bench jj -p
# 0.19s user 0.26s system 85% cpu 0.529 total
Спасибо @peak и вашему отвечать за это открытие jj!
Я придумал это решение: https://calbertts.medium.com/unix-pipelines-with-curl-requests-and-serverless-functions-e21117ae4c65
# this in your bash profile
jsonprettify() {
curl -Ss -X POST -H "Content-Type: text/plain" --data-binary @- https://jsonprettify.vercel.app/api/server?indent=$@
}
echo '{"prop": true, "key": [1,2]}' | jsonprettify 4
# {
# "prop": true,
# "key": [
# 1,
# 2
# ]
# }
Нет необходимости ничего устанавливать, если у вас есть подключение к Интернету и установлен cURL, вы можете использовать эту функцию.
Вы находитесь на другом хосте, где ничего не можете установить, это было бы идеальным решением этой проблемы.
Когда у вас установлен узел в вашей системе, работает следующее.
echo '{"test":1,"test2":2}' | npx json
{
"test": 1,
"test2": 2
}