Как я могу напечатать JSON в сценарии оболочки?
Есть ли (Unix) оболочка script для форматирования JSON в удобочитаемой форме?
В принципе, я хочу, чтобы он преобразовал следующее:
{ "foo": "lorem", "bar": "ipsum" }
... в нечто подобное:
{
"foo": "lorem",
"bar": "ipsum"
}
Ответы
Ответ 1
С 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"}'
.
Ответ 2
Вы можете использовать: jq
Он очень прост в использовании, и он отлично работает! Он может обрабатывать очень большие структуры JSON, включая потоки. Ты можешь найти
их учебники здесь.
Вот пример:
$ jq . <<< '{ "foo": "lorem", "bar": "ipsum" }'
{
"bar": "ipsum",
"foo": "lorem"
}
Или другими словами:
$ echo '{ "foo": "lorem", "bar": "ipsum" }' | jq .
{
"bar": "ipsum",
"foo": "lorem"
}
Ответ 3
Я использую аргумент "пробел" в 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));\
});\
"
Ответ 4
Я написал инструмент, который имеет один из лучших "умных белых" форматировщиков. Он дает более читаемый и менее подробный вывод, чем большинство других опций здесь.
подчеркивание-кли
Это то, что выглядит "умный белый":
Я могу быть немного предвзятым, но это отличный инструмент для печати и обработки данных 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
Этот инструмент - мой текущий проект страсти, поэтому, если у вас есть какие-либо запросы о функциях, есть хороший шанс, я обращусь к ним.
Ответ 5
Обычно я просто делаю:
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
Ответ 6
Благодаря Дж. Ф. Себастьяну очень полезные указатели, здесь немного расширенный 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))
Ответ 7
Это не слишком просто с родным способом с инструментами jq.
Например:
cat xxx | jq .
Ответ 8
Если вы используете npm и Node.js, вы можете сделать npm install -g json
, а затем выполнить команду через json
. Сделайте json -h
, чтобы получить все варианты. Он также может вытащить определенные поля и раскрасить результат с помощью -i
.
curl -s http://search.twitter.com/search.json?q=node.js | json
Ответ 9
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
, и вы хорошо перейти.
Ответ 10
С 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" ).
Ответ 11
JSON Ruby Gem поставляется с оболочкой script для защиты JSON:
sudo gem install json
echo '{ "foo": "bar" }' | prettify_json.rb
Script скачать: gist.github.com/3738968
Ответ 12
ОБНОВЛЕНИЕ Я использую 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
.
Ответ 13
Что я делаю:
curl yourUri | json_pp
Он сокращает код и выполняет задание.
Ответ 14
Попробуйте pjson
. Он имеет цвета!
Установите его с помощью pip
:
⚡ pip install pjson
А затем pjson
любой контент JSON в pjson
.
Ответ 15
простой 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
Ответ 16
$ 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"
}
Ответ 17
Я использую jshon, чтобы сделать то, что вы описываете. Просто запустите:
echo $COMPACTED_JSON_TEXT | jshon
Вы также можете передавать аргументы для преобразования данных JSON.
Ответ 18
Или, с Ruby:
echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'
Ответ 19
Отъезд Jazor. Это простой синтаксический анализатор JSON, написанный на Ruby.
gem install jazor
jazor --help
Ответ 20
Вы можете использовать эту простую команду для достижения результата:
echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool
Ответ 21
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
Ответ 22
Просто подайте вывод на jq .
.
Пример:
twurl -H ads-api.twitter.com '.......' | jq .
Ответ 23
Pygmentize
Я совмещаю Python json.tool с pygmentize:
echo '{"foo": "bar"}' | python -m json.tool | pygmentize -g
Есть несколько альтернатив pygmentize, которые перечислены в моем ответе.
Вот живая демонстрация:
Ответ 24
С 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
Ответ 25
Я рекомендую использовать утилиту командной строки 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
Ответ 26
-
brew install jq
-
command + | jq
- (пример:
curl localhost:5000/blocks | jq
)
- Наслаждайтесь!
Ответ 27
jj работает очень быстро, может экономно обрабатывать огромные JSON-документы, не работает с действительными числами JSON и прост в использовании, например:
jj -p # for reading from STDIN
или же
jj -p -i input.json
Он (2018) все еще довольно новый, так что, возможно, он не будет обрабатывать некорректный JSON так, как вы ожидаете, но его легко установить на основные платформы.
Ответ 28
bat
- это клон cat
с подсветкой синтаксиса:
Пример:
echo '{"bignum":1e1000}' | bat -p -l json
-p
будет выводиться без заголовков, а -l
будет явно указывать язык.
Он имеет раскраску и форматирование для JSON и не имеет проблем, отмеченных в этом комментарии: Как мне красиво напечатать JSON в сценарии оболочки?
Ответ 29
Установите yajl-инструменты с помощью команды ниже:
sudo apt-get install yajl-tools
то
echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat
Ответ 30
yajl
очень хорошо, по моему опыту. Я использую команду json_reformat
для печати .json
файлов в vim
, помещая следующую строку в мой .vimrc
:
autocmd FileType json setlocal equalprg=json_reformat