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

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

По сути, я хочу, чтобы он изменил следующее:

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

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

{
    "foo": "lorem",
    "bar": "ipsum"
}
stackoverflow.com/a/12892039/998291
shleim 15.10.2012 12:51

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

Nick Tomlin 21.11.2012 18:42

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

exhuma 09.11.2012 17:40

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

Javaaaa 09.11.2014 19:56

Просто небольшой интересный лакомый кусочек, который может быть очень очевидным, но для тех, кто пытается красиво распечатать файл, содержащий JSON, это работает echo "$(cat nameOfYourFile.js)" | python -m json.tool

beckah 23.04.2015 18:31

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

peak 11.09.2015 19:48

JSON только на один уровень? Это исключает решения на основе регулярных выражений в случае отрицательного ответа.

sixFingers 29.06.2016 04:46

У кого-нибудь есть удобный способ распечатать файл JSON на месте?

LarsH 29.08.2018 00:41

@LarsH вот интерактивный просмотрщик JSON github.com/antonmedv/fx

Anton Medvedev 25.11.2018 09:09

Слишком много (одинаковых) ответов, сложно найти список возможных решений. Я сделал тест, чтобы попытаться обобщить эти. Надеюсь, это не будет очередным бесполезным ответом!

Ulysse BN 09.04.2020 14:08

Если вы хотите отформатировать свой json в виде таблицы, вы можете использовать jtab, инструмент, написанный на ржавчине, который позволяет вам это сделать: github.com/wlezzar/jtab

Lezzar Walid 15.06.2020 21:59
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
3 249
11
1 375 801
57

Ответы 57

Есть 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 :)

Robert Gould 09.12.2008 11:55

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

Rörd 16.12.2011 19:12

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

dwlz 17.03.2014 06:28

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

jfs 17.03.2014 11:21

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

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

icktoofay 31.05.2013 06:58

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

Gabe Johnson 31.10.2014 21:37

И чтобы избежать сортировки с комментарием @ icktoofay, импортируйте OrderedDict следующим образом: from collections import OrderedDict.

Hugo 22.09.2015 12:30

Спасибо @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 13.06.2016 20:05

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

JL Peyret 25.01.2017 23:40

Решения 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 намного более гибкое и простое. Спасибо, что указали на это.

AnC 01.08.2009 11:28

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

dvogel 05.08.2010 01:08

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

jfs 19.05.2011 10:41

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

Zachary Vance 19.04.2013 00:53

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

Bui Anh Tuan 22.08.2017 11:34

Или с Ruby:

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

Это дает мне ошибку. Вам нужен какой-нибудь пакет ruby ​​json?

mjs 06.01.2010 15:09

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

darscan 09.01.2010 16:38

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

Phrogz 27.06.2011 19:59

В Windows попробуйте это: echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'

Ross Attrill 15.02.2016 01:43

С 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

YOUR ARGUMENT IS VALID 19.04.2011 20:33

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

Shrikant Sharat 03.12.2011 07:24

псевдоним ppj = 'python -mjson.tool'; echo '{"foo": "lorem", "bar": "ipsum"}' | ppj

Everett Toews 03.05.2012 23:19

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

Chris Nash 27.06.2012 00:35

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

imwilsonxu 15.10.2012 10:59

Кажется, что это позволяет избежать символов Unicode в \ uXXXX, что может быть недостатком.

user1071136 16.10.2012 15:24

Этот совет очень удобен при просмотре выходных данных Riak или (других серверов с поддержкой JSON)! например curl blah.com:8089 | python -mjson.tool Вам абсолютно не нужно ничего устанавливать или настраивать, кроме python, который обычно уже есть.

Andz 19.11.2012 07:56

Эй, может ли кто-нибудь помочь с добавлением этой внешней команды в gedit? Обновлено: понял; Инструменты -> Управление внешним Toosl -> новый (+) -> добавить «python -mjson.tool» -> Выбрать Вход = Текущий документ, Выход = Заменить текущий документ. Ваше здоровье!

Aswin Kumar 04.03.2013 00:29

У кого-нибудь есть то же самое для XML?

Mike Weller 08.03.2013 15:20

@MikeWeller stackoverflow.com/questions/16090869/…

svidgen 18.04.2013 22:54

и добавьте подсветку синтаксиса, направив вывод в 'colout -t json'. Сначала требуется "pip install colout".

Jonathan Hartley 11.07.2013 13:12

@ 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 = (',', ':'))

user7610 03.02.2014 19:20

Он не принимает массивы верхнего уровня, поэтому, к сожалению, не все json.

J.N. 24.02.2014 11:12

@ShrikantSharat: начиная с версии 1.5 Pygments также поддерживают тип json.

piotr.d 06.02.2015 19:42

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

Clint Eastwood 25.02.2015 20:42

И если JSON находится в файле: $ cat file.json | python -m json.tool

nishanthshanmugham 03.05.2015 07:08

Другая проблема с python -m json.tool как красивым принтером JSON заключается в том, что он не всегда печатает допустимые значения JSON. Например. 1e1000 преобразуется в бесконечность.

peak 04.09.2015 05:44

python не поддерживает не-ascii

Jake 13.01.2016 11:40

Изменено в Python 3.5: теперь вывод в том же порядке, что и ввод. Используйте --sort-keys для сортировки ключей по алфавиту. В ответ на комментарий @ChrisNash.

pnd 18.02.2016 14:49

Если вы используете macOS и у вас есть json в буфере обмена, который вы хотите отформатировать в pbpaste | python -m json.tool | pbcopy.

arete 22.06.2016 01:54

Удивительный! Спасибо, что поделились этим. Кроме того, если вы передали параметр «-i» для cURL, он не сможет правильно распечатать json, поскольку теперь у вас также есть заголовки HTTP.

asgs 18.11.2016 09:24

Что, если я захочу записать его в cat с помощью python -m json.tool /path.json?

Jack 07.08.2017 17:09

Есть ли способ лучше отформатировать скобки? (Используйте тот же столбец для левой скобки и соответствующей правой скобки)

12431234123412341234123 08.08.2017 15:46

@ClintEastwood - параметр curl -s подавляет вывод, например curl -s http://my_url/ | python -m json.tool Нужно просто распечатать JSON.

Loftx 21.12.2017 14:35

Это просто ответ на вопрос, как это сделать в Python или в Интернете. Буква вопроса кажется удовлетворительной, но я не думаю, что он был полностью удовлетворен духом. 3551 голос "за" кажутся чрезмерной реакцией.

Lightness Races in Orbit 16.02.2018 03:41

какой модуль требуется установить? Я получаю: / usr / bin / python: No module named json.module

Wakan Tanka 20.02.2019 16:42

@ClintEastwood Чтобы подавить отчет / полоску прогресса curl, просто передайте флаг молчания: curl -s

anarchist912 30.09.2019 15:18

это самый высокий непринятый ответ за все время

Alex M 18.10.2019 20:06

Методика из этого ответа для всех файлов .json в вашем текущем каталоге: for file in *.json; do python -m json.tool $file > ${file/.json/.pretty.json}; done

tanius 23.10.2019 02:53
json.tool плохо работает с большими файлами. Где-то там есть fp.read(), читающий весь файл JSON.
Finn Årup Nielsen 29.10.2019 15:52

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)).

a3nm 30.05.2011 10:40

в Ubuntu вы можете: sudo apt-get install ruby-json-pure вместо gem install

Janus Troelsen 27.03.2012 21:45

`` 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: команда не найдена

Eric Hartford 31.05.2012 22:05

может вы могли бы выложить содержимое вашего prettify_json.rb?

Andrew 23.08.2012 20:56

Вы можете загрузить скрипт, переместить его в папку ~/bin (убедитесь, что он находится в вашем PATH), переименуйте prettify_json.rb в ppj и запустите chmod +x ppj. Теперь можно сделать что-то вроде curl www.jsonsring.com/something.json | ppj

Uri 02.10.2012 18:39
prettify_json.rb поставляется с Ruby 1.9 и новее.
Benjamin Oakes 03.12.2012 18:46

В 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!

Janus Troelsen 15.05.2012 15:16

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

MichielB 06.12.2013 13:42

К вашему сведению, в моей системе Mac OS X 10.9 json_pp доступен автоматически.

Gregg Williams 13.05.2014 07:38
-t null дал мне null: недопустимый формат ... но его отключение отлично сработало. Спасибо.
Lucas 04.03.2017 23:53

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

Kjetil S. 20.03.2017 21:57
json_xs и json_pp не сохраняют порядок ключей и не сортируют ключи. Если дважды напечатать один и тот же файл JSON, это может привести к разным результатам. (Протестировано с perl-5.26.1-6 и libjson-xs-perl-3.040-1 в Ubuntu 18.04.)
user743382 24.05.2018 15:00

Я использую аргумент «пробел» в 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

Gurpartap Singh 11.08.2011 22:05

Проголосовали против. OP - это «сценарий командной строки * nix», и этот ответ представляет собой другой контекст.

danorton 02.09.2012 18:30

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

calvinf 18.09.2012 00:08

Используйте node -e "console.info(JSON.stringify(JSON.parse(process.argv[1]), null, '\t'));" в командной строке Unix (с nodejs)

Timo Tijhof 02.05.2013 06:30

узел -e 'var f = require ("./ package.json"); console.info (имя_файлы); ' Еще короче: D: D: D

RusHughes 25.06.2013 18:00

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

Julian D. 05.11.2014 19:26

JSON.stringify я всегда использую

kplshrm7 19.09.2015 15:50

Отстойно, что сценарий отличается для имени файла и stdin

Lukasz Wiktor 17.02.2016 16:39

@LukaszWiktor этого не должно быть, если ваш * nix поддерживает /dev/stdin!

strugee 08.04.2018 09:41

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

gem install jazor
jazor --help

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

Leo Cassarani 23.11.2011 04:32

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

Andrew 23.08.2012 22:07

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

Andrew 23.08.2012 22:11

Если вы используете 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

По моему опыту, yajl очень хорош. Я использую его команду json_reformat для красивой печати файлов .json в vim, помещая следующую строку в свой .vimrc:

autocmd FileType json setlocal equalprg=json_reformat

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

echo $COMPACTED_JSON_TEXT | jshon

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

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

Alexander 14.06.2012 02:45

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

joensson 20.06.2012 15:32

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

Ryan Ballantyne 23.04.2013 00:48

В 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

Florian 07.11.2013 16:51

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

Iolo 16.02.2015 12:47

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

peak 04.09.2015 05:54

Вот как это сделать с помощью скрипта 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 раз быстрее.

MarkHu 19.01.2018 05:10

Я автор 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 должен отклонять такой ввод.

Salman A 27.04.2012 14:50

Последние две ссылки кажутся неработающими ("Сервер на deron.meranda.us слишком долго отвечает").

Peter Mortensen 09.04.2019 16:08

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 не требуется)

Adrien Joly 18.06.2020 15:50

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

подчеркивание-cli

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

Я могу быть немного предвзятым, но это отличный инструмент для печати и управления данными 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 | подчеркивание и по-прежнему использовать подчеркивание для другого форматирования

Gal Bracha 20.11.2013 22:42

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

Maxim Ponomarev 20.01.2015 12:44

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

tiurin 24.01.2015 15:18

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

Bluu 27.02.2015 03:37

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

mycargus 14.05.2015 05:37

Кроме того, с помощью npm (используйте creationix / nvm :) для установки, потому что он должен быть глобальным: npm install -g underscore-cli ... затем в .bash_profile: alias json = 'underscore print --color' ... и используйте вроде: cat some.json | json Underscore-CLI действительно великолепен и легко интегрируется в вашу среду разработки.

mysterlune 19.01.2016 22:32

Я знаю, что исходный пост запрашивал сценарий оболочки, но есть так много полезных и нерелевантных ответов, которые, вероятно, не помогли первоначальному автору. Добавляем к неактуальности :)

Кстати, я не мог заставить работать какие-либо инструменты командной строки.

Если кому-то нужен простой код 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

Потрясающие. Не требует другого языка / интерпретатора и находится в репозитории пакетов, варить не нужно!

Joseph Lust 21.06.2014 18:15

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

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

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

⚡ pip install pjson

А затем передайте все содержимое JSON в pjson.

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

Kristjan Adojaan 22.11.2013 16:47

Недостатком является невозможность вывода цветного вывода с помощью grep.

Kristjan Adojaan 22.11.2013 16:54

Вы можете использовать: 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"
}

Или используйте jq с фильтром идентификации:

$ jq '.foo' <<< '{ "foo": "lorem", "bar": "ipsum" }'
"lorem"

Также есть опция --sort-keys, которая в некоторых случаях бывает полезна.

Matthew Flaschen 04.11.2014 04:17

jq - отличный инструмент, о котором я узнал благодаря этому ответу. Однако имейте в виду, что для работы требуются целые объекты. Он не начнет выводить результаты, пока не прочитает весь входной объект.

jimbo 03.01.2015 02:00

Работа с curl: curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5‌​' | jq '.'

Hover Ruan 21.04.2015 10:44

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

peak 04.09.2015 05:38

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

Leo 18.11.2016 08:33

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

jchook 28.12.2016 23:10

Вот хороший список возможностей jq, включая раздел, посвященный красивой печати: shapehed.com/jq-json/#how-to-pretty-print-json. Один из способов записать ваш уродливый файл в красивый: cat ugly.json | jq '.' | cat > pretty.json

ericsoco 11.05.2017 23:39

Ввод cat | jq . и затем вставка работали. Похоже, больше нет ... jq просто выходит по какой-то причине. Теперь я использую псевдоним вставки из буфера обмена: clipread | jq. Псевдоним - alias clipread='xclip -out -selection clipboard' (добавьте его в свой ~/.bashrc, zshrc или любой другой-rc и выберите псевдоним, который вам нравится).

Luc 16.08.2017 10:44

Чтение из файла jq . <<< cat filename.json

Hendry 13.10.2017 13:59
jq лучший, потому что печатает в цветах!
phil294 14.01.2018 02:07

@Luc. Попробуйте cat - | jq . с вставленным текстом. Всем удачи.

shellter 19.03.2018 15:39
jq -C для включения цветов. Если вы передаете вывод на less, затем на export LESS = "-R", а затем используйте jq -C ... | less. Без -Cjq подавляет цвета, когда вывод не направляется на терминал, как в | command или > file.
codeforester 10.11.2018 02:56

У jq есть раздражающее свойство, заключающееся в том, что он незаметно теряет точность чисел. Например. если в вашем вводе есть "foo": 16962331779841739123, то jq '.' будет молча округлять число до "foo": 16962331779841739000. Если я ищу только красивый принтер, то я бы выбрал тот, который не с потерями.

Lucian Wischik 27.05.2019 08:18

+1, в отличие от решения python, jq также обрабатывает некоторые неправильно отформатированные данные (например, файлы резервных копий NVR Ubiquiti), например: echo '{"foo":0}{"bar":1}' | jq, где python подавляется отсутствующей запятой и не дает отформатированного вывода.

TheAmigo 24.07.2020 23:42
echo '{"value": 1e1000}' | fx .value
Anton Medvedev 04.09.2020 01:36

Почему, черт возьми, на странице 2 скрыто более 1000 голосов за этот ответ? jq на сегодняшний день является одним из лучших инструментов для работы. Stack Overflow необходимо улучшить алгоритм сортировки ответов.

friederbluemle 09.12.2020 12:06

Версия 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";'

Fabien Sa 05.03.2016 16:42

Поддержка нескольких линий: 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;'

Zack Morris 23.02.2017 04:35

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

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

Из README:

Pretty print web service responses like so:

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

and 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 секунд ...

volker 28.04.2015 22:27

60 МБ JSON? Ух ты! Обычно я не работаю с такими большими, но полезными файлами. Спасибо.

jordelver 29.04.2015 00:43

В моем ящике ubuntu у меня есть json_pp, который прекрасно форматирует json, хотя, несмотря на схожесть имен, я считаю, что это совершенно другой проект, чем упомянутый здесь jsonpp.

davidpricedev 29.07.2016 14:24

Вот решение 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, которые перечислены в мой этот ответ.

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

Demo

Иногда для окрашивания необходимо использовать pygmentize -l json.

J P 23.11.2015 13:13

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

jan 05.01.2018 14:56

Для 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

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

Evgeny Karpov 27.07.2016 19:58

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

Zaboj Campula 06.10.2016 13:21

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

Blag 20.02.2018 17:12

@Blag, скрипт выглядел сломанным после вашего редактирования, объясните или исправьте это. Благодарность!

Evgeny Karpov 21.02.2018 06:31

@EvgenyKarpov приятный улов, полный откат не нужен, только grep, который по ошибке стерли;)

Blag 21.02.2018 09:47

Этот сценарий довольно хрупкий и не поддерживает полный синтаксис json. Например, он превращает { "\"" : "quote" } в { "\" " : " } (на нескольких строках).

Rotsor 23.06.2019 18:45

Это очень хорошо работает с трубопроводом. getMyLogs | grep -Eo ...

Matthis Kohli 15.08.2019 14:41

Спасибо, чувак, мне нужен был быстрый способ отформатировать 8-мегабайтный однострочный json-файл с помощью простого bash.

Ahmed M 19.08.2019 12:40

В моем случае мне также нужно было выполнить json_pretty.sh, например cat file.json | ./json_pretty.sh

pcko1 09.03.2020 18:36

Лучшее решение, если у вас есть автономный скрипт и вы не хотите заставлять кого-то устанавливать Homebrew, python, ruby, node.js ...

njh 02.01.2021 02:46

Инструмент 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>

Pramit 08.10.2016 00:50
brew install jq, если у вас Mac OS.
Distwo 14.10.2016 19:38

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

peak 21.10.2016 09:00

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

Mark Reed 31.01.2017 16:08

Если вы не против использования стороннего инструмента, вы можете просто от завиток до jsonprettyprint.org. Это для случая, когда вы не можете установить пакеты на машину.

curl -XPOST https://jsonprettyprint.org/api -d '{"user" : 1}'

Чтобы передать stdin этой команде, сделайте что-то вроде этого: echo '{ "foo": "lorem", "bar": "ipsum" }' | curl -XPOST https://jsonprettyprint.org/api -d @-

Niel de Wet 29.05.2017 16:13

Если у вас установлен 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));});

Nikhil Ranjan 30.05.2017 20:33

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

curl yourUri | json_pp

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

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

jonathanjo 21.06.2019 16:22

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.

peak 20.10.2017 10:23

или просто: jq . file.json; но и cat file.json | jq (без фильтра .) тоже работает. (на ubuntu / linux; ymmv на разных платформах)

michael 01.12.2017 10:33
  1. brew install jq
  2. command + | jq
  3. (пример: curl localhost:5000/blocks | jq)
  4. Наслаждаться!

Используйте 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

Enter image description here

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

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

Eugene C 07.10.2019 23:29

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

pushNpop 10.10.2019 05:50

Он выполняет сортировку в python 2, в 3 он не сортирует github.com/python/cpython/blob/3.8/Lib/json/tool.py

HardQuestions 23.09.2020 12:03

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

для меня нет вывода с этим примером, хотя я проголосовал за это давным-давно. Что-то изменилось ...

Matthis Kohli 09.03.2020 17:55

@MatthisKohli: Я только что перепроверил это на Node V12.x, и он работает. В этом коде нет ничего волшебного. fs.readFileSync(0) читает stdin текущего процесса, а JSON.stringify форматирует JSON. Таким образом, вероятность поломки при смене API очень мала.

harish2704 09.03.2020 19:22

Вы можете использовать Сидель.

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. Спасибо!

David H 28.04.2020 21:42

@DavidH - помогает ли это: stackoverflow.com/questions/37668134/…

Schmitzi 29.04.2020 13:53

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
}

Другие вопросы по теме