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

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

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

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

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

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

Ответы [ 54 ]

4 голосов
/ 25 сентября 2018

Однострочное решение с использованием Node.js будет выглядеть так:

$ node -e "console.log( JSON.stringify( JSON.parse(require('fs').readFileSync(0) ), 0, 1 ))"

Например:

$ cat test.json | node -e "console.log( JSON.stringify( JSON.parse(require('fs').readFileSync(0) ), 0, 1 ))"
3 голосов
/ 26 января 2012

С JavaScript / Node.js: взгляните на плагин vkBeautify.js , который обеспечивает приятную печать как для текста JSON, так и для XML.

Он написан на простом JavaScript, менее 1,5 КБ (минимизирован) и очень быстрый.

3 голосов
/ 11 января 2012

Я автор json-liner . Это инструмент командной строки, чтобы превратить JSON в удобный для пользователя формат grep. Попробуйте.

$ echo '{"a": 1, "b": 2}' | json-liner
/%a 1
/%b 2
$ echo '["foo", "bar", "baz"]' | json-liner
/@0 foo
/@1 bar
/@2 baz
3 голосов
/ 01 февраля 2017

Если у вас установлен Node.js, вы можете создать его самостоятельно с помощью одной строки кода. Создайте файл довольно:

> vim pretty

#!/usr/bin/env node

console.log(JSON.stringify(JSON.parse(process.argv[2]), null, 2));

Добавить разрешение на выполнение:

> chmod + x pretty

> ./pretty '{"foo": "lorem", "bar": "ipsum"}'

Или, если ваш JSON находится в файле:

#!/usr/bin/env node

console.log(JSON.stringify(require("./" + process.argv[2]), null, 2));

> ./pretty file.json

2 голосов
/ 13 августа 2014

Вот Groovy однострочник:

echo '{"foo": "lorem", "bar": "ipsum"}' | groovy -e 'import groovy.json.*; println JsonOutput.prettyPrint(System.in.text)'
2 голосов
/ 20 февраля 2017

https://github.com/aidanmelen/json_pretty_print

from __future__ import unicode_literals
from __future__ import absolute_import
from __future__ import print_function
from __future__ import division

import json
import jsonschema

def _validate(data):
    schema = {"$schema": "http://json-schema.org/draft-04/schema#"}
    try:
        jsonschema.validate(data, schema,
                            format_checker=jsonschema.FormatChecker())
    except jsonschema.exceptions.ValidationError as ve:
        sys.stderr.write("Whoops, the data you provided does not seem to be " \
        "valid JSON.\n{}".format(ve))

def pprint(data, python_obj=False, **kwargs):
    _validate(data)
    kwargs["indent"] = kwargs.get("indent", 4)
    pretty_data = json.dumps(data, **kwargs)
    if python_obj:
        print(pretty_data)
    else:
       repls = (("u'",'"'),
                ("'",'"'),
                ("None",'null'),
                ("True",'true'),
                ("False",'false'))
    print(reduce(lambda a, kv: a.replace(*kv), repls, pretty_data))
2 голосов
/ 11 декабря 2015
1 голос
/ 08 марта 2019

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

echo '{"foo": "lorem", "bar": "ipsum"}' | smk -e"JSON.stringify(JSON.parse(data), null, 4)"

На одной строке

echo '{"foo": "lorem", "bar": "ipsum"}' | npx smk -e"JSON.stringify(JSON.parse(data), null, 4)"
1 голос
/ 07 марта 2012

Мои файлы JSON не были проанализированы ни одним из этих методов.

Моя проблема была похожа на сообщение Является ли источник данных Google JSON недействительным? .

Ответ на этот пост помог мне найти решение.

Он считается недействительным JSON без строковых ключей.

{id:'name',label:'Name',type:'string'}

должно быть:

{"id": "name", "label": "Name", "type": "string"}

Эта ссылка дает хорошее исчерпывающее сравнение некоторых различных анализаторов JSON: http://deron.meranda.us/python/comparing_json_modules/basic

Что привело меня к http://deron.meranda.us/python/demjson/. Я думаю, что этот один синтаксический анализатор намного более отказоустойчив, чем многие другие.

0 голосов
/ 18 января 2019

Вы можете использовать Xidel .

Xidel - это инструмент командной строки для загрузки и извлечения данных из страниц HTML / XML или JSON-API с использованием CSS, XPath 3.0, XQuery 3.0, JSONiq или шаблонных шаблонов. Он также может создавать новые или преобразованные документы XML / HTML / JSON.

Xidel pretty-prints по умолчанию:

$ xidel -s - -e '$json' <<< '{"foo":"lorem","bar":"ipsum"}'
{
  "foo": "lorem",
  "bar": "ipsum"
}

или

$ echo '{"foo":"lorem","bar":"ipsum"}' | xidel -s - -e .
{
  "foo": "lorem",
  "bar": "ipsum"
}
...