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

Выше код может не работать. Вышеупомянутый динамический запрос будет разрешен следующим примером. Токен является целым числом 35.

collection.find("_id":"{$gt: 35}")
          .sort({'_id': -1}).limit(25).toArray(function(error, films); 

, в результате чего возникает ошибка

Правильный синтаксис должен быть:

collection.find("_id":{$gt: 35}).  

Двойные «" кавычки не должны быть там.

2825
задан 16 revs, 12 users 29%AnC 9 November 2018 в 23:41
поделиться

11 ответов

Существует TidyJSON.

Это - C#, поэтому возможно, можно добраться, это для компиляции с Моно , и продолжающий работать *отклоняет. Никакие гарантии, хотя, извините.

4
ответ дан 2 revs, 2 users 78% 9 November 2018 в 23:41
поделиться
  • 1
    @Chaitanya: согласно RFC 2396, разделите 3.1, ktp отлично допустимы название схемы. Например, пользовательский протокол мог определить эту схему. – Alex 25 August 2011 в 12:49
$ 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"
}
43
ответ дан 4 revs, 2 users 52% 9 November 2018 в 23:41
поделиться
  • 1
    @betabandido: Если Вы используете time, как предложено, Вы don' t должны решить. Это сообщает и о прошедшем времени и о процессорном времени. – Mike Seymour 16 June 2012 в 11:48

Благодаря J.F. Очень полезные указатели Sebastian, вот немного расширенный сценарий, который я придумал:

#!/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))
86
ответ дан 2 revs, 2 users 95%AnC 10 November 2018 в 09:41
поделиться

Можно просто использовать стандартные инструменты как jq или json_pp.

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

или

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

оба украсит вывод как следующее (jq еще более красочный):

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

огромное преимущество jq состоит в том, что он может сделать НАМНОГО больше, если требуется проанализировать и обработать json.

13
ответ дан 22 November 2019 в 19:47
поделиться

В * 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 it, и все готово.

69
ответ дан 22 November 2019 в 19:47
поделиться

Или, с Ruby:

echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'
38
ответ дан 22 November 2019 в 19:47
поделиться

With Python 2.6+ you can just do:

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

or, if the JSON is in a file, you can do:

python -m json.tool my_json.json

if the JSON is from an internet source such as an API, you can use

curl http://my_url/ | python -m json.tool

For convenience in all of these cases you can make an alias:

alias prettyjson='python -m json.tool'

For even more convenience with a bit more typing to get it ready:

prettyjson_s() {
    echo "$1" | python -m json.tool
}

prettyjson_f() {
    python -m json.tool "$1"
}

prettyjson_w() {
    curl "$1" | python -m json.tool
}

for all the above cases. You can put this in .bashrc and it will be available every time in shell. Invoke it like prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'.

4277
ответ дан 22 November 2019 в 19:47
поделиться

Сценарий JSON Ruby Gem поставляется в комплекте со скриптом оболочки для притворства JSON:

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

Загрузка скрипта: gist.github.com/3738968

65
ответ дан 22 November 2019 в 19:47
поделиться

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

71
ответ дан 22 November 2019 в 19:47
поделиться

Я использую аргумент «пробел» в 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));\
 });\
"
373
ответ дан 22 November 2019 в 19:47
поделиться

Решения Дж. Ф. Себастьяна не работали у меня в Ubuntu 8.04.
Вот модифицированная версия Perl, которая работает со старой библиотекой JSON 1.X:

perl -0007 -MJSON -ne 'print objToJson(jsonToObj($_, {allow_nonref=>1}), {pretty=>1}), "\n";'
7
ответ дан 22 November 2019 в 19:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: