Як можна гарненько роздрукувати JSON у сценарії оболонки?


3061

Чи існує сценарій оболонки (Unix) для форматування JSON у читаному для людини вигляді?

В основному, я хочу, щоб вона перетворила наступне:

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

... у щось подібне:

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


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

Натрапили на це, але потім знайшли Json Pretty, і мені це дуже подобається. Typekit використовує його у своїх прикладах API, тому за ним стоїть деяка кльоут ^^
Нік Томлін

Якщо ви не заперечуєте над копіюванням вставлення, є також деякі прості інструменти в Інтернеті, такі як jsonprettyprint.net, де ви можете швидко роздрукувати ваш сирий JSON.
Javaaaa

7
Будьте попереджені: python -m json.tool не завжди створює дійсний JSON. (Підказка: 1e1000)
пік

Відповіді:


4460

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


72
Ви можете pygmentize -l javascriptпередати це, щоб отримати синтаксичний кольоровий вихід у вашому командному рядку. Редагувати : Якщо у вас встановлені пігменти, це є.
Шрікант Шарат

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

14
У мій .vimrc "nnoremap <f5>:%! Python -m json.tool <CR>: w <CR>"
imwilsonxu

40
Здається, це дозволить уникнути символів Unicode в \ uXXXX, що може бути недоліком.
користувач1071136

13
Я створив псевдонім: alias pretty='python -mjson.tool | pygmentize -l jsonтак що я можу просто запустити: command params | pretty. Сподіваюсь, це допомагає. PS: Якщо комусь вдасться розширити це на а) видалити висновок curl, який я бачу кожного разу, та / або b) НЕ сортувати ключі 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"
}

The. є фільтром ідентичності.


11
Також є --sort-keysваріант, який корисний у деяких випадках.
Меттью Флашен

9
Робота з завитком:curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
Наведіть курсор Ruan

19
"jq." чудово підходить як симпатичний принтер, але він поставляється із застереженням: jq (до jq версії 1.5) змінить значення дуже великих і дуже малих чисел, оскільки він аналізує числові значення як 64-бітові значення IEEE 754. Щоб перевірити, чи має ваш улюблений симпатичний принтер однакову проблему, спробуйте це значення: 1e1000. Зауважте, що python -mjson.tool погано справляється з цим тестом, оскільки він створює нескінченність, що навіть не є 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
Gurpartap Singh

11
Захищений. В ОП йдеться про "* сценарій командного рядка nix", і ця відповідь є іншим контекстом.
Данортон

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

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

2
Зрозуміло, що сценарій відрізняється від імені файлу проти stdin
Лукаш Віктор

340

Я написав інструмент, який має один з найкращих форматів "розумних пробілів". Це дає більш читабельний і менш багатослівний вихід, ніж більшість інших варіантів тут.

підкреслення-cli

Ось як виглядає "розумний пробіл":

Я, можливо, трохи упереджений, але це дивовижний інструмент для друку та обробки даних JSON з командного рядка. Він надзвичайно зручний у використанні та має велику допомогу / документацію командного рядка. Це швейцарський армійський ніж, який я використовую для 1001 різних невеликих завдань, які б дивно дратували робити будь-який інший спосіб.

Останній випадок використання: Chrome, консоль Dev, вкладка «мережа», експортуйте все як файл HAR, "cat site.har | підкреслити вибір '.url' - вихідний текст | grep mydomain"; тепер у мене є хронологічно впорядкований список усіх URL-адрес, отриманих під час завантаження сайту моєї компанії.

Досить легко друкувати:

underscore -i data.json print

Однакові речі:

cat data.json | underscore print

Те саме, більш явне:

cat data.json | underscore print --outfmt pretty

Цей інструмент є моїм поточним захопленням, тому якщо у вас є запити щодо функцій, є хороший шанс, що я їх вирішу.


4
Я також оновив свій ~ / .bash_profile, щоб мати такий рядок: псевдонім underscor = 'підкреслити друк --outfmt досить' тепер я можу просто зробити curl example.com/result.json | Підкресліть і все ще використовуйте підкреслення для іншого форматування
Гал Брача

Дякую, Дейв! Інструмент хороший! псевдонім pretty-json = "гарненький підрив" і вихід завитків радує око
Максим Пономарьов

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

Я люблю, jqале це чудово спрацювало для мого "JSON", який не мав подвійних цитованих ключів.
Блу

@DaveDopson дякую за чудовий інструмент !! Спробуй використовувати його поряд з jsonselect.org/#tryit ...
mycargus

173

Я зазвичай просто роблю:

echo '{"test":1,"test2":2}' | python -mjson.tool

І для отримання вибраних даних (у цьому випадку значення "тестування"):

echo '{"test":1,"test2":2}' | python -c 'import sys,json;data=json.loads(sys.stdin.read()); print data["test"]'

Якщо дані JSON у файлі:

python -mjson.tool filename.json

Якщо ви хочете зробити це все за один раз з curlкомандного рядка, використовуючи маркер автентифікації:

curl -X GET -H "Authorization: Token wef4fwef54te4t5teerdfgghrtgdg53" http://testsite/api/ | python -mjson.tool

якщо json повинен надходити безпосередньо з http api, це також хороший інструмент, реалізований у python: github.com/jkbr/httpie
Флоріан

Якщо у вас встановлений вузол (і не заперечуйте вихід стилю YAML), є також такий пакет: rafeca.com/prettyjson, щоб ви могли закінчити завивку| prettyjson
Іоло,

3
Як зазначалося вище, одна з проблем з python -mjson.tool як симпатичним принтером JSON полягає в тому, що він не завжди випромінює JSON. Наприклад, 1e1000 стає нескінченним (використовуючи python 2.x або 3.x). 'jq.' завжди створює JSON, але це не гарантує, що дуже великі (або дуже малі значення) точно зберігаються.
пік

88

Завдяки дуже корисним покажчикам JF Себастьяну, ось дещо розширений сценарій, який я придумав:

#!/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=(',', ': '))" Зверніть увагу, що роздільники повинні бути встановлені як (',', ':'), щоб уникнути додавання пробілів у бік
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 на всіх платформах)
michael

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" призначений для "pure perl" - інструмент реалізований лише в Perl, без прив'язки до зовнішньої бібліотеки C (що означає XS, "Система розширення" Perl).


9
Здається, це відповідає стандарту Cygwin!
Янус Троельсен

12
json_pp можна використовувати таким же чином, і він, швидше за все, легко встановлюється у вашій системі (для Debian він знаходиться в пакеті "perl").
MichielB

8
FYI, у моїй системі Mac OS X 10.9 json_pp доступна автоматично.
Грегг Вільямс

-t nullдав мені null: не припустимий формат ... але відмова від нього спрацювала чудово. Дякую.
Лукас

pp призначений для чистого Perl, не дуже друкує тут :) Оскільки json_xs та json_pp можуть зробити більше, ніж просто гарненьке друк, а також за допомогою -json_opt робити інші речі замість гарного друку. Хоча гарне друкування - це поведінка за замовчуванням.
Kjetil S.

70

У режимі * 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

3
Для програм, які очікують іменований файл, використовуйте / dev / stdin, ditto для out та error.
dvogel

4
FYI fileinput.input()читає з stdin, якщо в командному рядку немає файлів. Приклад
jfs

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

- запитує він у скрипті оболонки, а не іншою мовою python. З JQ це можна зробити бездоганно.
Bui Anh Tuan

65

JSON Ruby Gem в комплекті зі сценарієм оболонки для вподобання JSON:

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

Завантаження сценарію: gist.github.com/3738968


6
Зауважте, що це рішення декодує послідовність виходу 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 дорогоцінний камінь Встановлення документації 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
Урі

58

ОНОВЛЕННЯ Я використовую jqзараз, як запропоновано в іншій відповіді. Він надзвичайно потужний при фільтруванні JSON, але, в самому своєму основному, також дивовижний спосіб красивого друку JSON для перегляду.

jsonpp - дуже приємний принтер JSON командного рядка.

З ПРОЧИТАННЯ:

Гарні друковані відповіді веб-служб так:

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

і зробити красиві файли, що працюють на вашому диску:

jsonpp data/long_malformed.json

Якщо ви перебуваєте на Mac OS X, можете brew install jsonpp. Якщо ні, ви можете просто скопіювати двійковий файл кудись у свій $PATH.


1
Я спробував jsonpp (раніше використовувався успішно) проти величезного файлу (> 60MB). Я припинив це через 5хв. Я переклав його python -mjson.tool(з іншої відповіді тут), і це зайняло 10-20сек ...
volker

60 Мб JSON? Оце Так! Я зазвичай не маю справу з великими, але корисними для них файлами. Дякую.
jordelver

У моєму вікні ubuntu у мене є json_pp- який прекрасно форматує json, хоча, незважаючи на схожість у називанні, я вважаю, що це зовсім інший проект від jsonppзгаданого тут
davidpricedev

56

Ось як я це роблю:

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 - немає рубіну, немає JavaScript, немає доступу до Інтернету для завантаження модулів python ... У мене дещо інший awk, який не підтримує %*cнотацію, тому я змінив printfна c=0; while (c++<offset) printf " "; printf $0;. І у мого awk є різний вислід, який витікає, і нахил не працює []. Я змінив регулярні вирази на /^[[{]/і /[]}]/.
Забой Кампула

2
Це має бути прийнято, оскільки воно є повним носієм і не вимагає програмного забезпечення сторонніх розробників ...
Blag

1
@EvgenyKarpov приємний улов, немає необхідності в повному відкаті, просто те, grepщо було стерто помилково;)
Blag

1
Дякую чувак, я хотів швидким способом відформатувати одномісний json з 8 МБ, у простому башті.
Ахмед М

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
Недоліком є ​​те, що неможливо обрізати кольоровий вихід.
Kristjan Adojaan

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
Рьор

Приклад Python можна спростити. Набагато простіше вводити вихід JSON прямо в python -m json.tool.
Dan Loewenherz

@Dan: так. І є кілька відповідей, які показують json.toolприклади коду. 1. Ця версія дозволяє змінювати деякі параметри, наприклад, indent2. На момент публікації (2008 р.) Ще використовувався Python 2.4 , який не підтримує-mjson.tool
jfs

40

Я використовую jshon, щоб робити саме те, що ви описуєте. Просто запустіть:

echo $COMPACTED_JSON_TEXT | jshon

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


Дякую, jshon набагато швидше, ніж використання python або ruby ​​для того ж завдання
Олександр

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

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

38

Або з Ruby:

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

Це дає мені помилку. Вам потрібен встановлений пакет рубінового json?
міс

3
Так, вам потрібен JSON Ruby Gem: sudo gem install json
darscan

@MatSchaffer Зауважте, що це не працює, якщо ви використовуєте JSON для серіалізації об'єктів за допомогою спеціальних to_jsonметодів; Kernel#jjлише симпатичний друк масивів і хешів однакових (або цифр / рядків / булевих).
Фрогз

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

36

Перевірте Jazor . Це простий аналізатор командного рядка JSON, написаний на Ruby.

gem install jazor
jazor --help

4
Це лише я чи це єдина пропозиція, яка насправді відповідає на питання ОП? Я прийшов сюди, шукаючи просту команду, в яку я міг би передати висновок, curlі це єдине, що зробив це для мене.
Лев Кассарані

2
Мені подобається, що у неї є можливість розфарбувати вихід. Полегшує читання.
Андрій

oo, мені також подобається можливість передавати URL, оскільки я використовую це для перегляду результатів мого REST API
Ендрю

35

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

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

Найкраща відповідь на мій погляд. Невеликий та простий у запам'ятовуванні та не потребує встановлення будь-яких нестандартних інструментів.
Євген C

python -m json.tool, здається, не зберігає порядок об’єкта JSON.
pushNpop

31

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

28

Просто передайте вихід на jq ..

Приклад:

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

Приємна відповідь @Ackshaey Singh, і ви можете легко перенаправити те ж саме до файлу. напр.cat <file_name.txt> | jq . > <output_name.txt>
Pramit

9
brew install jqякщо ви на Mac OS.
Distwo

1
На жаль, використання jq .для симпатичного друку має один потенційний недолік: всі існуючі версії jq наполягають на трактуванні номерів JSON як номерах IEEE, тому точність легко втрачається, наприклад, для дуже великих цілих чисел.
пік

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

24

Пігментізувати

Я поєдную json.tool Python з pygmentize:

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

Є кілька альтернатив пігментізації, які перераховані в моїй відповіді .

Ось демонстрація в прямому ефірі:

Демо


5
Іноді потрібно використовувати, pygmentize -l jsonщоб отримати забарвлення.
JP

Встановити з влучним пакета python-pygments, тобтоapt-get install python-pygments
джан

23

З 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


19

Я рекомендую використовувати утиліту командного рядка 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

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-інструменти за допомогою команди нижче:

sudo apt-get install yajl-tools

тоді,

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


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