Как я могу красиво напечатать JSON в сценарии оболочки?


3063

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

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

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

... в нечто вроде этого:

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


7
Некоторое время назад я откатил свой собственный: github.com/exhuma/braindump/tree/master/jsonformat Код очень прост с использованием собственной jsonбиблиотеки python , но я также добавил фрагменты, чтобы получить подсветку синтаксиса.
exhuma

Наткнулся на это, но потом нашел Json Pretty, и мне это очень нравится. Typekit использует его в своих примерах API, поэтому за этим стоит некоторый клочок ^^
Ник Томлин,

Если вы не против скопировать вставки, есть также несколько простых онлайн-инструментов, таких как jsonprettyprint.net, где вы можете быстро и просто распечатать исходный файл JSON.
Javaaaa

7
Имейте в виду : python -m json.tool не всегда создает допустимый JSON. (Подсказка: 1e1000)
пик

Ответы:


4462

С 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"}'.


73
Вы можете передать это, pygmentize -l javascriptчтобы получить синтаксический цветной вывод в вашей командной строке. Редактировать : Если у вас есть установленные фрагменты, это.
Шрикант Шарат

177
Отличный ответ, только предостережение, которое у меня есть, это то, что он сортирует ключи на выходе - о чем вам, возможно, следует знать.
Крис Нэш

14
В myy .vimrc "nnoremap <f5>:%! Python -m json.tool <CR>: w <CR>"
imwilsonxu

40
Похоже, что это убирает символы Юникода в \ uXXXX, что может быть недостатком.
user1071136

14
Я создал псевдоним: alias pretty='python -mjson.tool | pygmentize -l jsonтак что я могу просто запустить: command params | pretty. Надеюсь это поможет. PS: если кому-то удастся расширить это на: а) удалить вывод curl, который я вижу каждый раз, и / или б) НЕ сортировать ключи json; пожалуйста, дайте мне знать, я буду очень благодарен.
Клинт Иствуд

1023

Ты можешь использовать: jq

Он очень прост в использовании и отлично работает! Он может обрабатывать очень большие структуры 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"
}

. это идентификационный фильтр.


11
Существует также --sort-keysопция, которая полезна в некоторых случаях.
Мэтью Флэшен

9
Работа с curl:curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
Ховер Руан

19
"JQ." отлично подходит для симпатичных принтеров, но поставляется с оговоркой: jq (вплоть до jq версии 1.5) будет изменять значения очень больших и очень маленьких чисел, потому что он анализирует числовые значения как 64-битные значения IEEE 754. Чтобы проверить, есть ли у вашего любимого симпатичного принтера та же проблема, попробуйте это значение: 1e1000. Обратите внимание, что python -mjson.tool проваливает этот тест из-за того, что он производит Infinity, который даже не является JSON.
пик

1
Как примечание, вы можете перенаправить форматированный результат в файл: echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfile.
Чад

26
@Meekohi альтернатива - «ненужное использование эха». Супер рад, что нашел <<<оператора - именно то, что я искал.
Jchook

381

Я использую аргумент "пробел", 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"}'

Возвращает:

{
    "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

Используя трубу:

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));\
 });\
"

10
Для отладки объектов в Node.js вы должны действительно использовать sys.inspect () вместо JSON.stringify (). И вот почему: markhansen.co.nz/inspecting-with-json-stringify
Гурпартарп Сингх,

11
Downvoted. ОП касается «* nix-сценария командной строки», и этот ответ - другой контекст.
Данортон

49
@danorton: JS можно использовать из командной строки через node.js и другие подобные решения.
Кальвин

10
Нет необходимости в консоли: node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"также выводит результат в STDOUT.
Джулиан Д.

2
Это отстой, что сценарий отличается для имени файла и стандартного ввода
Лукаш Виктор

340

Я написал инструмент, который имеет один из лучших доступных форматировщиков «умных пробелов». Он производит более читаемый и менее подробный вывод, чем большинство других опций здесь.

Подчеркивание-кли

Вот как выглядит «умный пробел»:

Я могу быть немного предвзятым, но это потрясающий инструмент для печати и манипулирования данными JSON из командной строки. Он очень удобен в использовании и имеет обширную справку / документацию для командной строки. Это швейцарский армейский нож, которым я пользуюсь для выполнения 1001 разных небольших задач, что было бы удивительно раздражать, если бы я делал по-другому.

Последний вариант использования: Chrome, консоль Dev, вкладка Network, экспорт всего в виде файла 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

Этот инструмент является моим текущим страстным проектом, поэтому если у вас есть какие-либо пожелания, есть большая вероятность, что я отвечу на них.


4
Я также обновил свой ~ / .bash_profile, добавив в него следующую строку: alias underscor = 'underscore print --outfmt pretty', теперь я могу просто сделать curl example.com/result.json | подчеркивание и все еще использование подчеркивания для другого форматирования
Gal Bracha

Спасибо, Дейв! Инструмент хорош! alias pretty-json = "underrsore pretty" и кудрявый вывод радует глаз
Максим Пономарев

Отличный инструмент форматирования, всего одна заметка: пересылка вывода в файл (либо с параметром -o, либо с > ) работает только с подчеркиванием печати . Подчеркивание довольно сохраняет файл с признаками форматирования цвета вставляется, как чего - л: [32m, [33m, [39mнаряду с некоторыми непечатаемыми перед каждым из них, что делает JSON не действительным. Однако одна только печать подчеркивания ничего не добавляет к файлу и отлично выполняет свою работу по форматированию.
Тиурин

Я люблю, jqно это отлично сработало для моего "JSON", у которого не было ключей с двойными кавычками.
Bluu

@DaveDopson спасибо за отличный инструмент! Попробую использовать его вместе с jsonselect.org/#tryit ...
mycargus

173

Я обычно просто делаю:

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
Florian

Если у вас установлен узел (и вы не возражаете против вывода в стиле YAML), есть также этот пакет: rafeca.com/prettyjson, чтобы вы могли закончить скручивание с помощью | prettyjson
Iolo

3
Как отмечалось выше, одна из проблем с python -mjson.tool в качестве JSON pretty-printer заключается в том, что он не всегда генерирует JSON. Например, 1e1000 становится бесконечностью (будь то использование Python 2.x или 3.x). "JQ." всегда создает JSON, но это не гарантирует, что очень большие (или очень маленькие значения) сохраняются точно.
пик

88

Благодаря очень полезным указателям Дж.Ф. Себастьяна, вот немного улучшенный сценарий, который я придумал:

#!/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))

3
Когда значения загружаются в словарь, порядок теряется: обычные dictобъекты не имеют определенного порядка. Попробуйте, json.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False)и вы все равно обнаружите, что они поменялись местами. Чтобы это исправить, импорт OrderedDictи loadпрохождение object_pairs_hook=OrderedDict.
icktoofay

Вы можете изменить скрипт для чтения из стандартного ввода с этим: inputFile = sys.stdin. Это позволяет передавать материал в сценарий следующим образом:curl http://somewhere.com/foo.json | pp_json.py
Гейб Джонсон,

1
И чтобы избежать сортировок с @ icktoofay замечанием, импорт OrderedDict как это: from collections import OrderedDict.
Уго

2
Спасибо @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
blindsnowmobile

Отличный фрагмент! Я использовал sort_keys = Trueвместо этого, потому что я хочу использовать это для сравнения файлов JSON, и это работает как шарм.
JL Peyret

81

Если вы используете npm и Node.js, вы можете сделать, npm install -g jsonа затем передать команду через json. Сделайте, json -hчтобы получить все варианты. Он также может извлечь определенные поля и раскрасить вывод с помощью -i.

curl -s http://search.twitter.com/search.json?q=node.js | json

79

С инструментами jq это не так просто .

Например:

cat xxx | jq .

7
ВНИМАНИЕ: jq кодирует числа как 64-разрядные числа с плавающей запятой IEEE 754, и, следовательно, их представление может измениться. Точность очень маленьких и очень больших чисел может быть потеряна. Чтобы проверить, есть ли у вашего любимого симпатичного принтера та же проблема, попробуйте это значение: 1e1000.
пик

5
или просто jq . file.json:; но тоже cat file.json | jq(без фильтра .) тоже работает. (в Ubuntu / Linux; YMMV на разных платформах)
Майкл

73

С 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 «Extension System»).


9
Кажется, стандартно поставляется с Cygwin!
Янус Троелсен

13
json_pp можно использовать таким же образом и, скорее всего, он легко устанавливается в вашей системе (в Debian он находится в пакете 'perl').
MichielB

8
К вашему сведению, в моей системе Mac OS X 10.9 json_pp доступен автоматически.
Грегг Уильямс

-t nullдал мне ноль: не действительный формат ... но оставив его, работал великолепно. Спасибо.
Лукас

pp предназначен для чистого Perl, здесь не просто печатать :) Так как json_xs и json_pp могут делать больше, чем просто печатать, а также с -json_opt делают другие вещи вместо симпатичной печати. Хотя красивая печать - это поведение по умолчанию.
Кжетил С.

70

На * nix чтение из стандартного ввода и запись в стандартный вывод работает лучше:

#!/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 гораздо более гибко и просто. Спасибо за указание на это.
AnC

3
Для программ, которые ожидают именованный файл, используйте / dev / stdin, ditto для out и err.
двогель

4
FYI fileinput.input()читает из стандартного ввода, если в командной строке не указаны файлы. Пример
JFS

fileinput.input () не может хорошо работать с файлами без перевода строки в конце, когда я проверял последний раз.
Захари Вэнс

он спрашивает в сценарии оболочки, а не на другом языке Python. С JQ можно сделать это отлично.
Буй Ань Туан

65

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

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

Скрипт загрузки: gist.github.com/3738968


6
Обратите внимание, что это решение декодирует escape-последовательности unicode "\ uxxxx", в отличие от Python с json.tool. Тем не менее, он также имеет ограничения по вложенности ( nesting of 20 is too deep (JSON::NestingError)).
a3nm

2
на Ubuntu вы можете сделать: sudo apt-get install ruby-json-pureвместоgem install
Janus Troelsen

1
`` `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
Uri

58

ОБНОВЛЕНИЕ Я использую 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.


1
Я попытался jsonpp (используется в прошлом успешно) против огромного файла (> 60 МБ). Я остановил его через 5 минут. Я передал это python -mjson.tool(из другого ответа здесь), и это заняло 10-20 секунд ...
Фолькер

60 МБ JSON? Вот Это Да! Я обычно не имею дело с файлами, которые большие, но полезные. Спасибо.
jordelver

На моем Ubuntu Box у меня есть json_pp- который хорошо форматирует json, хотя, несмотря на сходство в именовании, я считаю, что это совершенно другой проект, чем jsonppупомянутый здесь
davidpricedev

57

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

curl yourUri | json_pp

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


3
Сервер Ubuntu: Если у вас есть производственные машины с очень ограниченными установками, это может быть лучшим выбором, поскольку он устанавливается по умолчанию под определенным именем. Python часто устанавливается по-разному (например, python3, python или вообще не устанавливается) в зависимости от версии.
jonathanjo

55

простой 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

1
Спасибо за ответ. Я только что написал этот скрипт сегодня для личного использования, и он отлично работал в моих случаях. Я исправил, теперь он меньше и без этой проблемы. Нет цели поддерживать полностью форматирование, но я могу внести другие исправления, если это необходимо.
Евгений Карпов

2
Это единственный рабочий ответ, который я нашел. У меня есть встроенный Linux - не Rubby, ни JavaScript, нет доступа к Интернету для загрузки модулей питона ... У меня есть немного другой AWK , который не поддерживает %*cзапись , поэтому я изменил printfк c=0; while (c++<offset) printf " "; printf $0;. И у моего awk есть другое выражение, и обратный слеш не работает []. Я изменил регулярные выражения /^[[{]/и /[]}]/.
Забой Кампула

2
Это должно быть принято, так как оно полностью нативное и не требует стороннего программного обеспечения ...
Blag

1
@EvgenyKarpov хороший улов, нет необходимости в полном откате, только то, grepчто было стерто по ошибке;)
Blag

1
Спасибо, чувак, я хотел быстрый способ отформатировать 8-мегабайтный однострочный json в простом bash.
Ахмед М

53

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

echo '{"json": "obj"} |  pjson

Установите его с помощью pip:

⚡ pip install pjson

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


Для этого требуется python-pip (sudo apt-get install python-pip), а затем (sudo pip install pjson). Большим преимуществом являются цвета!
Кристьян Адоджан

1
Недостатком является невозможность получения цветного вывода.
Кристьян Адоджан

51
$ 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 :)
Роберт Гулд

2
В версии модуля JSON, которая у меня есть, to_jsonкажется, не принимаются параметры. Но это работает:perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
Rörd

Пример Python может быть упрощен. Намного проще направить вывод JSON прямо в python -m json.tool.
Дэн Левенхерц

@ Дан: да. И есть несколько ответов, которые показывают json.toolпримеры кода. 1. эта версия позволяет вам изменять некоторые параметры, например, indent2. Во время публикации (2008) Python 2.4 все еще использовался , который не поддерживает-mjson.tool
jfs

40

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

echo $COMPACTED_JSON_TEXT | jshon

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


Спасибо, jshon намного быстрее, чем использование python или ruby ​​для той же задачи
Александр

2
@ Александр - Как быстро нужен симпатичный принтер? Я на OSx Lion, который поставляется с предустановленным Python. С помощью python -mjson.tool я могу довольно просто распечатать json-файл размером 96 КБ за 0,1 с - выходное значение json Earthporn, на которое ссылается jshon, составляет около 24 КБ, и я вполне могу напечатать его за 0,08 с. Насколько быстрее для вас jshon?
Йоэнссон

1
Я работаю со сжатыми файлами данных JSON размером 1 + ГБ (кто даже знает, насколько велики несжатые файлы), поэтому я очень ценю предположение, что jshon работает быстрее.
Райан Баллантайн

38

Или с Руби:

echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'

Это дает мне ошибку. Вам нужен установленный пакет ruby ​​json?
MJS

3
Да, вам нужен JSON Ruby Gem: sudo gem install json
darscan

@MatSchaffer Обратите внимание, что это не работает, если вы используете JSON для сериализации объектов с помощью пользовательских to_jsonметодов; Kernel#jjтолько Pretty-печатает массивы и одинаковые хэши (или числа / строки / логические значения).
Phrogz

В Windows попробуйте следующее: echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
Росс Аттрилл,

36

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

gem install jazor
jazor --help

4
Это только я или это единственное предложение, которое действительно отвечает на вопрос ОП? Я пришел сюда в поисках простой команды, в которую я мог бы передать результаты, curlи это единственная команда, которая сделала это для меня.
Лео Кассарани

2
Мне нравится, что он имеет возможность раскрасить вывод. Облегчает чтение.
Эндрю

ооо, мне также нравится возможность передавать URL, так как я использую его для просмотра выходных данных моего REST API
Эндрю

35

Вы можете использовать эту простую команду для достижения результата:

echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool

Лучший ответ на мой взгляд. Маленький и легко запоминающийся, не требует установки каких-либо нестандартных инструментов.
Евгений С

python -m json.tool, похоже, не сохраняет порядок объекта JSON.
pushNpop


28

Просто передайте вывод jq ..

Пример:

twurl -H ads-api.twitter.com '.......' | jq .

Хороший ответ @ Ackshaey Singh, и можно легко перенаправить его в файл. напр.cat <file_name.txt> | jq . > <output_name.txt>
Прамит

9
brew install jqесли вы на Mac OS.
Distwo

1
К сожалению, использование jq .для симпатичной печати имеет один потенциальный недостаток: все существующие версии jq требуют обработки чисел JSON как чисел IEEE, поэтому точность легко теряется, например, для очень больших целых чисел.
пик

2
@Pramit cat file |неизменно является пустой тратой процесса; просто делай jq . <file_name.txt >output_name.txt(с литералом <и >символами).
Марк Рид

25

С Perl, если вы установите JSON :: PP из CPAN, вы получите команду json_pp . Кража примера из B Bycroft вы получите:

[pdurbin@beamish ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

Стоит отметить, что json_ppпоставляется с предустановленной Ubuntu 12.04 (как минимум) и Debian в/usr/bin/json_pp


24

Pygmentize

Я комбинирую Python's json.tool с pygmentize:

echo '{"foo": "bar"}' | python -m json.tool | pygmentize -g

Есть несколько альтернатив пигментированию, которые перечислены в моем ответе .

Вот живая демонстрация:

демонстрация


5
Иногда нужно использовать, pygmentize -l jsonчтобы получить цветообразование.
JP

Установить с меткому пакета python-pygments, то естьapt-get install python-pygments
джан

19

Я рекомендую использовать утилиту командной строки 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

19

Вы можете просто использовать стандартные инструменты, такие как 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. Спасибо!
Дэвид Х

1
@DavidH - это поможет: stackoverflow.com/questions/37668134/…
Schmitzi

Спасибо! Никогда раньше не слышал о JQ.
Дэвид Х

17

jj работает очень быстро, экономно обрабатывает огромные JSON-документы, не работает с действительными числами JSON и прост в использовании, например:

jj -p # for reading from STDIN

или

jj -p -i input.json

Он (2018) все еще довольно новый, поэтому, возможно, он не будет обрабатывать недействительный JSON, как вы ожидаете, но его легко установить на основные платформы.



16

batэто catклон с подсветкой синтаксиса:

Пример:

echo '{"bignum":1e1000}' | bat -p -l json

-pбудет выводить без заголовков, и -lбудет явно указывать язык.

Он имеет раскраску и форматирование для JSON и не имеет проблем, отмеченных в этом комментарии: Как я могу красиво напечатать JSON в сценарии оболочки?


12

Установите yajl-tools с помощью команды ниже:

sudo apt-get install yajl-tools

тогда,

echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat


Потрясающие. Не требует другого языка / переводчика и находится в репозитории пакета, не нужно варить!
Джозеф Луст
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.