"193.186.9.74 - 193.186.9.74"

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

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

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

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

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

{
    "foo": "lorem",
    "bar": "ipsum"
}
2695
09 дек. '08 в 11:20
источник поделиться
55 ответов
  • 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"}' его как prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'.

4014
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"
}
784
05 марта '13 в 21:34
источник

Я использую аргумент "пробел" в 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));\
 });\
"
366
12 июля '10 в 16:00
источник

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

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

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

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

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

328
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
171
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))
85
10 дек. '08 в 1:22
источник

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

curl -s http://search.twitter.com/search.json?q=node.js | json
70
30 янв. '11 в 3:46
источник

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

68
30 июня '10 в 17:31
источник

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

67
31 июля '09 в 3:51
источник

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

Например:

cat xxx | jq .
67
18 мая '17 в 18:47
источник

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

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

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

64
29 дек. '10 в 19:36
источник

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

53
21 мая '13 в 12:18
источник

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

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

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

⚡ pip install pjson

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

51
29 янв. '13 в 15:23
источник

Что я делаю:

curl yourUri | json_pp

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

46
03 февр. '17 в 0:23
источник
$ 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"
}
41
09 дек. '08 в 11:52
источник

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

echo $COMPACTED_JSON_TEXT | jshon

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

39
20 мая '11 в 2:51
источник

Или, с Ruby:

echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'
36
21 окт. '09 в 12:10
источник

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

gem install jazor
jazor --help
36
25 янв. '11 в 21:35
источник

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

Пример:

twurl -H ads-api.twitter.com '.......' | jq .
29
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
27 апр. '12 в 13:37
источник

Ванильный баш

Простой 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) Использовать с Windows Git Bash из файла в файл (на основе UTF-8):

cat fileIn.json |sh.exe json_pretty.sh > fileOut.json
24
27 июля '16 в 10:54
источник

Pygmentize

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

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

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

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

Demo

23
27 авг. '15 в 13:09
источник

С 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
07 окт. '11 в 21:27
источник

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

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

15
15 сент. '17 в 23:38
источник

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

jj -p # for reading from STDIN

или же

jj -p -i input.json

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

15
25 февр. '18 в 16:50
источник

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

sudo apt-get install yajl-tools

то

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

11
23 нояб. '12 в 16:30
источник

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

autocmd FileType json setlocal equalprg=json_reformat
10
18 мая '11 в 19:32
источник

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

Пример:

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

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

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

9
03 сент. '18 в 10:15
источник

Версия 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
9
18 апр. '13 в 21:45
источник
  • 1
  • 2

Посмотрите другие вопросы по меткам или Задайте вопрос