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

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

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

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

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

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

Ответы

Ответ 1

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

Ответ 2

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

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

Вот пример:

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

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

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

Ответ 3

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

Returns:

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

Использование pipes:

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));\
 });\
"

Ответ 4

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

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

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Например:

cat xxx | jq .

Ответ 8

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

curl -s http://search.twitter.com/search.json?q=node.js | json

Ответ 9

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

Ответ 10

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

Ответ 11

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

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

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

Ответ 12

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

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

Из README:

Довольно распечатать ответы веб-сервисов так:

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

и создайте красивые файлы на вашем диске:

jsonpp data/long_malformed.json

Если вы работаете в Mac OS X, вы можете brew install jsonpp. Если нет, вы можете просто скопировать двоичный файл куда-нибудь в $PATH.

Ответ 13

Что я делаю:

curl yourUri | json_pp

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

Ответ 14

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

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

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

⚡ pip install pjson

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

Ответ 15

простой 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

Ответ 16

$ 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"
}

Ответ 17

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

echo $COMPACTED_JSON_TEXT | jshon

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

Ответ 18

Или, с Ruby:

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

Ответ 19

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

gem install jazor
jazor --help

Ответ 20

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

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

Ответ 21

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

Ответ 22

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

Пример:

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

Ответ 23

Pygmentize

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

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

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

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

Demo

Ответ 24

С Perl, если вы установите JSON :: PP из CPAN, вы получите команду json_pp. Кража примера из B Bycroft вы получите:

[[email protected] ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

Стоит отметить, что json_pp поставляется с предустановленной Ubuntu 12.04 (как минимум) и Debian в /usr/bin/json_pp

Ответ 25

Я рекомендую использовать утилиту командной строки 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

Ответ 26

  • brew install jq
  • command + | jq
  • (пример: curl localhost:5000/blocks | jq)
  • Наслаждайтесь!

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

Ответ 27

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

jj -p # for reading from STDIN

или же

jj -p -i input.json

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

Ответ 28

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

Пример:

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

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

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

Ответ 29

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

sudo apt-get install yajl-tools

то

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

Ответ 30

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

autocmd FileType json setlocal equalprg=json_reformat