Как я могу печатать JSON в оболочке (Unix) script?

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

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

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

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

{
    "foo": "lorem",
    "bar": "ipsum"
}
2272
задан AnC 09 дек. '08 в 11:20
источник поделиться
48 ответов
  • 1
  • 2

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

3454
ответ дан B Bycroft 17 дек. '09 в 12:48
источник поделиться

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

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

Вот пример:

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

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

$ echo '{ "foo": "lorem", "bar": "ipsum" }' | jq .
{
  "bar": "ipsum",
  "foo": "lorem"
}
583
ответ дан Vita Pluvia 05 марта '13 в 21:34
источник поделиться

Я использую аргумент "space" [JSON.stringify] 1 для красивой печати 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));\
 });\
"
339
ответ дан Somu 12 июля '10 в 16:00
источник поделиться

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

underscore-cli

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

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

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

312
ответ дан Dave Dopson 01 мая '12 в 19:48
источник поделиться

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

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
156
ответ дан locojay 01 нояб. '11 в 4:19
источник поделиться

Благодаря Дж. Ф. Себастьяну очень полезные указатели, здесь немного расширенный 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))
81
ответ дан AnC 10 дек. '08 в 1:22
источник поделиться

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

62
ответ дан knb 30 июня '10 в 17:31
источник поделиться

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

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

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

62
ответ дан Paul Horsfall 29 дек. '10 в 19:36
источник поделиться

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

62
ответ дан Daryl Spitzer 31 июля '09 в 3:51
источник поделиться

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

curl -s http://search.twitter.com/search.json?q=node.js | json
61
ответ дан isaacs 30 янв. '11 в 3:46
источник поделиться

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

51
ответ дан jordelver 21 мая '13 в 12:18
источник поделиться

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

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

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

⚡ pip install pjson

И затем передайте любой контент JSON на pjson.

46
ответ дан Johann Philipp Strathausen 29 янв. '13 в 15:23
источник поделиться

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

echo $COMPACTED_JSON_TEXT | jshon

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

37
ответ дан yardena 20 мая '11 в 2: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"
}

Если оставшаяся часть вашего конвейера будет изящно обрабатывать юникод, и вы хотите, чтобы ваш 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"
}
35
ответ дан jfs 09 дек. '08 в 11:52
источник поделиться

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

gem install jazor
jazor --help
34
ответ дан Mike Conigliaro 25 янв. '11 в 21:35
источник поделиться

Или, с Ruby:

echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'
31
ответ дан darscan 21 окт. '09 в 12:10
источник поделиться

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

Например:

cat xxx | jq .
28
ответ дан Olexandr Minzak 18 мая '17 в 18:47
источник поделиться

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

Пример:

twurl -H ads-api.twitter.com '.......' | jq .
28
ответ дан Ackshaey Singh 04 окт. '16 в 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
27
ответ дан Salman A 27 апр. '12 в 13:37
источник поделиться

Я рекомендую использовать утилиту командной строки 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
17
ответ дан htaccess 03 февр. '11 в 1:06
источник поделиться

С 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

14
ответ дан Philip Durbin 07 окт. '11 в 21:27
источник поделиться

Pygmentize

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

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

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

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

Demo

13
ответ дан Shubham Chaudhary 27 авг. '15 в 13:09
источник поделиться
  • brew install jq
  • command + | jq
  • (пример: curl localhost:5000/blocks | jq)
  • Наслаждайтесь!

введите описание изображения здесь

12
ответ дан alexanderjsingleton 15 сент. '17 в 23:38
источник поделиться

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

sudo apt-get install yajl-tools

то

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

11
ответ дан Uma sankar pradhan 23 нояб. '12 в 16:30
источник поделиться

Что я делаю:

curl yourUri | json_pp

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

9
ответ дан JedatKinports 03 февр. '17 в 0:23
источник поделиться

Я использую 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
 }
8
ответ дан slashmili 06 марта '15 в 5:48
источник поделиться

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

autocmd FileType json setlocal equalprg=json_reformat
8
ответ дан Hank Gay 18 мая '11 в 19:32
источник поделиться

Версия 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
7
ответ дан svidgen 18 апр. '13 в 21:45
источник поделиться

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

gem install colorful_json
echo '{"foo": "lorem", "bar": "ipsum"}' | cjson
{
  "foo": "lorem",
  "bar": "ipsum"
}
6
ответ дан Pablo Fernandez heelhook 06 авг. '13 в 13:14
источник поделиться

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

perl -0007 -MJSON -ne 'print objToJson(jsonToObj($_, {allow_nonref=>1}), {pretty=>1}), "\n";'
5
ответ дан pimlottc 30 июня '09 в 0:01
источник поделиться
  • 1
  • 2

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