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

2628

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

В принципе, я хочу, чтобы он преобразовал следующее:

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

... в нечто подобное:

{
    "foo": "lorem",
    "bar": "ipsum"
}
  • 0
    stackoverflow.com/a/12892039/998291
  • 5
    Некоторое время назад я откатил свой собственный: github.com/exhuma/braindump/tree/master/jsonformat Код очень прост с использованием собственной библиотеки json python, но я также добавил фрагменты, чтобы получить подсветку синтаксиса.
Показать ещё 9 комментариев
Теги:
format
command-line
pretty-print

54 ответа

3909

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

  • 3
    В других версиях Python вы можете установить simplejson и использовать python -msimplejson.tool
  • 57
    Вы можете pygmentize -l javascript это на pygmentize -l javascript чтобы получить синтаксический цветной вывод в вашей командной строке. Редактировать : если у вас есть установленные фрагменты, это.
Показать ещё 25 комментариев
780

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

Он очень прост в использовании, и он отлично работает! Он может обрабатывать очень большие структуры JSON, включая потоки. Ты можешь найти их учебники здесь.

Вот пример:

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

Или другими словами:

$ echo '{ "foo": "lorem", "bar": "ipsum" }' | jq .
{
  "bar": "ipsum",
  "foo": "lorem"
}
  • 7
    Существует также опция --sort-keys , которая полезна в некоторых случаях.
  • 0
    JQ - отличный инструмент, который я обнаружил благодаря этому ответу. Имейте в виду, однако, что для работы требуются целые объекты. Он не начнет выводить результаты, пока не прочитает весь входной объект.
Показать ещё 11 комментариев
347

Я использую аргумент "space" для JSON.stringify для 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 с nodejs, указав 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));\
 });\
"
  • 9
    Для отладки объектов в Node.js вы действительно должны использовать sys.inspect () вместо JSON.stringify (). И вот почему: markhansen.co.nz/inspecting-with-json-stringify
  • 11
    Downvoted. OP о «* nix-сценарии командной строки», и этот ответ - другой контекст.
Показать ещё 8 комментариев
310

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

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

Это то, что выглядит "умный белый":

Изображение 4606

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

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

  • 4
    Я также обновил свой ~ / .bash_profile, добавив в него следующую строку: alias underscor = 'underscore print --outfmt pretty', теперь я могу просто сделать curl example.com/result.json | подчеркивание и по-прежнему использовать подчеркивание для другого форматирования
  • 0
    Спасибо, Дейв! Инструмент хорош! alias pretty-json = "underrsore pretty" и вывод curl радует глаз
Показать ещё 4 комментария
163

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

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
  • 2
    python> = 2.6 требуется
  • 0
    если предполагается, что json должен прийти напрямую из http api, это также хороший инструмент, реализованный на python: github.com/jkbr/httpie
Показать ещё 2 комментария
80

Благодаря Дж. Ф. Себастьяну очень полезные указатели, здесь немного расширенный 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))
  • 3
    Когда значения загружаются в словарь, порядок теряется: обычные объекты dict не имеют определенного порядка. Попробуйте json.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False) и вы все равно обнаружите, что они поменялись местами. Чтобы исправить это, импортируйте OrderedDict и load передачу object_pairs_hook=OrderedDict .
  • 0
    Вы можете изменить скрипт для чтения из стандартного ввода с помощью: inputFile = sys.stdin . Это позволяет передавать данные в сценарий следующим образом: curl http://somewhere.com/foo.json | pp_json.py
Показать ещё 3 комментария
70

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

  • 9
    Кажется, стандартно поставляется с Cygwin!
  • 11
    json_pp можно использовать таким же образом и, скорее всего, он легко устанавливается в вашей системе (в Debian он находится в пакете 'perl').
Показать ещё 5 комментариев
70

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, и вы хорошо перейти.

  • 0
    Действительно, использование stdin / stdout гораздо более гибко и просто. Спасибо за указание на это.
  • 3
    Для программ, которые ожидают именованный файл, используйте / dev / stdin, ditto для out и err.
Показать ещё 4 комментария
69

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

curl -s http://search.twitter.com/search.json?q=node.js | json
  • 2
    Это, безусловно, мой любимый ответ здесь.
64

Это не слишком просто с родным способом с инструментами jq.

Например:

cat xxx | jq .
  • 5
    ВНИМАНИЕ: jq кодирует числа как 64-разрядные числа с плавающей запятой IEEE 754, и, следовательно, их представление может измениться. Точность очень маленьких и очень больших чисел может быть потеряна. Чтобы проверить, есть ли у вашего любимого симпатичного принтера та же проблема, попробуйте это значение: 1e1000.
  • 1
    или просто: jq . file.json ; но также cat file.json | jq (без фильтра . ) также работает. (в Ubuntu / Linux; YMMV на разных платформах)
61

JSON Ruby Gem поставляется с оболочкой script для защиты JSON:

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

Script скачать: gist.github.com/3738968

  • 5
    Обратите внимание, что это решение декодирует escape-последовательности unicode "\ uxxxx", в отличие от Python с json.tool . Тем не менее, он также имеет ограничения по глубине вложения ( nesting of 20 is too deep (JSON::NestingError) ).
  • 2
    в Ubuntu вы можете сделать: sudo apt-get install ruby-json-pure вместо gem install
Показать ещё 4 комментария
51

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

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

Из 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 его в python -mjson.tool (из другого ответа здесь), и это заняло 10-20 секунд ...
  • 0
    60 МБ JSON? Вот Это Да! Я обычно не имею дело с файлами, которые большие, но полезные для понимания. Благодарю.
Показать ещё 1 комментарий
49

Попробуйте pjson. Он имеет цвета!

Изображение 4607

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

pip install pjson

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

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

Что я делаю:

curl yourUri | json_pp

Он сокращает код и выполняет задание.

  • 1
    офигенно .. спасибо большое
  • 2
    Лучшее решение, пробуемое при следовании за трубкой
41
$ 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"
}
  • 0
    на самом деле я делаю то же самое, но с самим javascript :)
  • 2
    В to_json меня версии модуля JSON to_json , to_json , не принимает параметры. Но это работает: perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
Показать ещё 2 комментария
38

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

echo $COMPACTED_JSON_TEXT | jshon

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

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

Или, с Ruby:

echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'
  • 0
    Это дает мне ошибку. Вам нужен установленный пакет ruby json?
  • 3
    Да, вам нужен JSON Ruby Gem: sudo gem установить json
Показать ещё 5 комментариев
36

Отъезд Jazor. Это простой синтаксический анализатор JSON, написанный на Ruby.

gem install jazor
jazor --help
  • 4
    Это только я или это единственное предложение, которое действительно отвечает на вопрос ОП? Я пришел сюда в поисках простой команды, в которую я мог бы передать вывод curl и это единственная команда, которая сделала это для меня.
  • 2
    Мне нравится, что он имеет возможность раскрасить вывод. Облегчает чтение.
Показать ещё 1 комментарий
29

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

Пример:

twurl -H ads-api.twitter.com '.......' | jq .
  • 0
    Хороший ответ @ Ackshaey Singh, и можно легко перенаправить его в файл. например, cat <file_name.txt> | jq . > <output_name.txt>
  • 9
    brew install jq если вы используете Mac OS.
Показать ещё 2 комментария
29

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
  • 0
    Хорошо работает в моей системе. Спасибо
24

Pygmentize

Я совмещаю Python json.tool с pygmentize:

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

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

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

Изображение 2516

  • 5
    Иногда нужно использовать pygmentize -l json чтобы получить цветопередачу.
  • 0
    Установить с помощью пакета apt python-pygments , то есть apt-get install python-pygments
19

Vanilla Bash

Простой сценарий Bash (grep/awk) для довольно 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}'

Примеры:

1) Чтение файла и печать в консоли

cat file.json | json_pretty.sh

2) Используйте с окнами GIT Bash из файла в файл (на основе UTF8):

cat fileIn.json |sh.exe json_pretty.sh > fileOut.json
  • 1
    Спасибо за ответ. Я только что написал этот скрипт сегодня для личного использования, и он отлично работал в моих случаях. Я исправил, теперь он меньше и без этой проблемы. Нет цели поддерживать полностью форматирование, но я могу внести другие исправления, если это необходимо.
  • 1
    Это единственный рабочий ответ, который я нашел. У меня есть встроенный Linux - нет Ruby, нет JavaScript, нет доступа к Интернету для загрузки модулей Python ... У меня немного другой awk, который не поддерживает запись %*c поэтому я изменил printf на c=0; while (c++<offset) printf " "; printf $0; , И у моего awk есть другое экранирование регулярных выражений, и обратная косая черта не работает в [] . Я изменил регулярные выражения на /^[[{]/ и /[]}]/ .
Показать ещё 3 комментария
18

С 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

18

Я рекомендую использовать утилиту командной строки 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
15
  • brew install jq
  • command + | jq
  • (пример: curl localhost:5000/blocks | jq)
  • Наслаждайтесь!

Изображение 4608

12

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

jj -p # for reading from STDIN

или же

jj -p -i input.json

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

11

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

sudo apt-get install yajl-tools

то

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

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

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

autocmd FileType json setlocal equalprg=json_reformat
9

Версия 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
  • 2
    Один вкладыш: echo '{"a":1,"b":2}' | php -r 'echo json_encode(json_decode(fgets(STDIN)), JSON_PRETTY_PRINT)."\n";'
  • 0
    Возможность многострочного: 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;'
8

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

Изображение 4609

8

Я использую 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
 }
7
echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool

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

7

Я знаю, что на этот вопрос ответили ad nauseam, но я хотел документировать решение Ruby, которое лучше, чем команда Json prettify, gem colorful_json довольно хорош.

gem install colorful_json
echo '{"foo": "lorem", "bar": "ipsum"}' | cjson
{
  "foo": "lorem",
  "bar": "ipsum"
}
7

J.F. Решения Sebastian не работали для меня в Ubuntu 8.04.
Вот модифицированная версия Perl, которая работает со старой библиотекой JXON 1.X:

perl -0007 -MJSON -ne 'print objToJson(jsonToObj($_, {allow_nonref=>1}), {pretty=>1}), "\n";'
6

bat - клон cat с подсветкой синтаксиса: https://github.com/sharkdp/bat

Пример:

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

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

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

6
$ sudo apt-get install edit-json
$ prettify_json myfile.json
  • 0
    E: невозможно найти пакет edit-json
6

Существует TidyJSON.

Это С#, поэтому, возможно, вы можете получить его для компиляции с Mono и работать с * nix. Никаких гарантий, хотя, извините.

5

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

5

Вот как это сделать с помощью Groovy script.

Создайте Groovy script, скажем, "pretty-print"

#!/usr/bin/env groovy

import groovy.json.JsonOutput

System.in.withReader { println JsonOutput.prettyPrint(it.readLine()) }

Сделайте исполняемый файл script:

chmod +x pretty-print

Теперь из командной строки

echo '{"foo": "lorem", "bar": "ipsum"}' | ./pretty-print
  • 1
    Как бы я ни любил Groovy, он не подходит для таких маленьких сценариев из-за накладных расходов JVM. Мои неофициальные измерения показывают, что jq примерно в 50 раз быстрее.
4

Для Node.js вы также можете использовать модуль "util". Он использует подсветку синтаксиса, интеллектуальное отступы, удаляет кавычки из ключей и просто делает вывод таким же красивым, как и он.

cat file.json | node -e "process.stdin.pipe(new require('stream').Writable({write: chunk =>  {console.log(require('util').inspect(JSON.parse(chunk), {depth: null, colors: true}))}}))"
3

Если у вас установлен Node.js, вы можете создать его самостоятельно с помощью одной строки кода. Создайте файл довольно:

> vim pretty

#!/usr/bin/env node

console.log(JSON.stringify(JSON.parse(process.argv[2]), null, 2));

Добавить разрешение выполнения:

> chmod + x pretty

> ./pretty '{ "foo": "lorem", "bar": "ipsum" }'

Или, если ваш JSON находится в файле:

#!/usr/bin/env node

console.log(JSON.stringify(require("./" + process.argv[2]), null, 2));

> ./pretty file.json

  • 0
    Можете ли вы сделать так, чтобы он принимал piped stdin
  • 1
    process.stdin.resume (); var input = ''; process.stdin.on ('data', (data) => {input + = data;}); process.stdin.on ('end', () => {console.log (JSON.stringify (JSON.parse (input), null, 2));});
3

С JavaScript/NodeJS: посмотрите vkBeautify.js плагин, который обеспечивает довольно печать для текста JSON и XML.

Он написан на обычном JavaScript, менее 1,5 КБ (минимализирован) и очень быстро.

3

Я автор json-liner. Это инструмент командной строки, чтобы превратить 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
2

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

Вот Groovy однострочный:

echo '{"foo": "lorem", "bar": "ipsum"}' | groovy -e 'import groovy.json.*; println JsonOutput.prettyPrint(System.in.text)'
1

Однострочное решение с использованием nodejs будет выглядеть так:

$ node -e "console.log( JSON.stringify( JSON.parse(require('fs').readFileSync(0) ), 0, 1 ))"

например:

$ cat test.json | node -e "console.log( JSON.stringify( JSON.parse(require('fs').readFileSync(0) ), 0, 1 ))"
0

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

Xidel - это инструмент командной строки для загрузки и извлечения данных со страниц HTML/XML или JSON-API с использованием CSS, XPath 3.0, XQuery 3.0, JSONiq или шаблонов шаблонов. Он также может создавать новые или преобразованные документы XML/HTML/JSON.

Xidel pretty-prints по умолчанию:

$ xidel -s - -e '$json' <<< '{"foo":"lorem","bar":"ipsum"}'
{
  "foo": "lorem",
  "bar": "ipsum"
}

или же:

$ echo '{"foo":"lorem","bar":"ipsum"}' | xidel -s - -e .
{
  "foo": "lorem",
  "bar": "ipsum"
}
0

просто добавив еще один вариант для полноты jtc - jtc:

bash $ echo '{"foo": "lorem", "bar": "ipsum"}' | jtc
{
   "bar": "ipsum",
   "foo": "lorem"
}
bash $ 

jtc пусть печать в сыром (компактном) формате. Для красивого формата также существует опция tab/indent:

bash $ echo '{"foo": "lorem", "bar": "ipsum"}' | jtc -r
{ "bar": "ipsum", "foo": "lorem" }
bash $ echo '{"foo": "lorem", "bar": "ipsum"}' | jtc -t1
{
 "bar": "ipsum",
 "foo": "lorem"
}
bash $ 
0
0

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

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

Мои файлы JSON не обрабатывались ни одним из этих методов.

Моя проблема была похожа на этот пост Источник данных Google JSON недействителен?.

Ответ на этот пост помог мне найти решение. https://stackoverflow.com/questions/628505/is-google-data-source-json-not-valid

Он считается недопустимым 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/. Я думаю, что этот парсер гораздо более терпим к ошибкам, чем многие другие.

  • 3
    JSON не допускает использование одинарных кавычек в качестве разделителей, и здравый анализатор JSON должен отклонять такой ввод.
-1

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

BTW Я не мог заставить инструменты командной строки работать.

Если кто-то хочет простой 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
}
-3

Вместо этого вы можете использовать онлайн-инструменты, если это вариант для вас.

Я считаю http://jsonprettyprint.net самым простым и легким.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню