Как я могу красиво напечатать JSON в сценарии оболочки? - PullRequest
2751 голосов
/ 09 декабря 2008

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

По сути, я хочу преобразовать следующее:

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

... примерно так:

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

Ответы [ 54 ]

4089 голосов
/ 17 декабря 2009

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

820 голосов
/ 05 марта 2013

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

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

Вот пример:

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

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

$ echo '{ "foo": "lorem", "bar": "ipsum" }' | jq .
{
  "bar": "ipsum",
  "foo": "lorem"
}
367 голосов
/ 12 июля 2010

Я использую аргумент "пробел" 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));\
 });\
"
329 голосов
/ 01 мая 2012

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

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

Вот как выглядит «умный пробел»:

Возможно, я немного предвзят, но это потрясающий инструмент для печати и обработки данных JSON из командной строки. Он очень удобен в использовании и имеет обширную справку / документацию для командной строки. Это швейцарский армейский нож, которым я пользуюсь для выполнения 1001 различных небольших задач, что было бы удивительно раздражать любым другим способом.

Последний вариант использования: Chrome, консоль Dev, вкладка Network, экспорт всего в виде файла 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

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

171 голосов
/ 01 ноября 2011

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

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
85 голосов
/ 10 декабря 2008

Благодаря очень полезным указателям Дж.Ф. Себастьяна, вот немного улучшенный сценарий, который я придумал:

#!/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))
72 голосов
/ 30 января 2011

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

curl -s http://search.twitter.com/search.json?q=node.js | json
72 голосов
/ 18 мая 2017

Не так просто с нативным способом с jq tools .

Например:

cat xxx | jq .
68 голосов
/ 30 июня 2010

В 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» означает «чистый perl» - ndash; инструмент реализован только на Perl, без привязки к внешней библиотеке C (что означает XS, «Система расширений» Perl).

68 голосов
/ 31 июля 2009

На * nix, чтение из стандартного ввода и запись в стандартный вывод работает лучше:

#!/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, и все готово.

...