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

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

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

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

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

{
    "foo": "lorem",
    "bar": "ipsum"
}
+2858
источник поделиться
57 ответов
  • 1
  • 2

Используйте Ruby в одной строке:

echo '{"test":1,"test2":2}' | ruby -e "require 'json'; puts JSON.pretty_generate(JSON.parse(STDIN.read))"

И вы можете установить псевдоним для этого:

alias to_j="ruby -e \"require 'json';puts JSON.pretty_generate(JSON.parse(STDIN.read))\""

Тогда вы можете использовать его более удобно

echo '{"test":1,"test2":2}' | to_j

{
  "test": 1,
  "test2": 2
}

И если вы хотите отображать JSON с цветом, вы можете установить awesome_print,

gem install awesome_print

затем

alias to_j="ruby -e \"require 'json';require 'awesome_print';ap JSON.parse(STDIN.read)\""

Попытайся!

echo '{"test":1,"test2":2, "arr":["aa","bb","cc"] }' | to_j

Enter image description here

+10
источник

Версия 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
источник
другие ответы

Связанные вопросы


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

Вот решение Ruby, которое лучше, чем команда Json prettify. Драгоценный камень colorful_json довольно хорош.

gem install colorful_json
echo '{"foo": "lorem", "bar": "ipsum"}' | cjson
{
  "foo": "lorem",
  "bar": "ipsum"
}
+8
источник

Я использую httpie

$ pip install httpie

И вы можете использовать его так:

 $ http PUT localhost:8001/api/v1/ports/my 
 HTTP/1.1 200 OK
 Connection: keep-alive
 Content-Length: 93
 Content-Type: application/json
 Date: Fri, 06 Mar 2015 02:46:41 GMT
 Server: nginx/1.4.6 (Ubuntu)
 X-Powered-By: HHVM/3.5.1

 {
     "data": [], 
     "message": "Failed to manage ports in 'my'. Request body is empty", 
     "success": false
 }
+8
источник

Однострочное решение с использованием 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 ))"
+8
источник

J.F. Решения Sebastian не работали для меня в Ubuntu 8.04.
Вот модифицированная версия Perl, которая работает со старой библиотекой JXON 1.X:

perl -0007 -MJSON -ne 'print objToJson(jsonToObj($_, {allow_nonref=>1}), {pretty=>1}), "\n";'
+7
источник
$ sudo apt-get install edit-json
$ prettify_json myfile.json
+6
источник

Инструмент ydump - довольно красивый принтер JSON:

$ ydump my_data.json
{
  "foo": "lorem",
  "bar": "ipsum"
}

Или вы можете подключиться к JSON:

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

Это, вероятно, самое короткое решение, кроме использования инструмента jq.

Этот инструмент является частью библиотеки yojson для OCaml и документирован здесь.

В Debian и производных пакет libyojson-ocaml-dev содержит этот инструмент. В качестве альтернативы yojson можно установить через OPAM.

+5
источник

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

Это С#, поэтому, возможно, вы можете получить его для компиляции с Mono и работать с * nix. Никаких гарантий, хотя, извините.

+4
источник

Вот как это сделать с помощью Groovy script.

Создайте Groovy script, скажем, "pretty-print"

#!/usr/bin/env groovy

import groovy.json.JsonOutput

System.in.withReader { println JsonOutput.prettyPrint(it.readLine()) }

Сделайте исполняемый файл script:

chmod +x pretty-print

Теперь из командной строки

echo '{"foo": "lorem", "bar": "ipsum"}' | ./pretty-print
+4
источник

Для Node.js вы также можете использовать модуль "util". Он использует подсветку синтаксиса, интеллектуальное отступы, удаляет кавычки из ключей и просто делает вывод таким же красивым, как и он.

cat file.json | node -e "process.stdin.pipe(new require('stream').Writable({write: chunk =>  {console.log(require('util').inspect(JSON.parse(chunk), {depth: null, colors: true}))}}))"
+4
источник

Я автор 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
источник

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

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

+3
источник

Если у вас установлен 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

+3
источник

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

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

или

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

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

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

Огромным преимуществом jq является то, что он может сделать ОЧЕНЬ больше, если вы хотите проанализировать и обработать json.

+3
источник

Вот Groovy с одним вкладышем:

echo '{"foo": "lorem", "bar": "ipsum"}' | groovy -e 'import groovy.json.*; println JsonOutput.prettyPrint(System.in.text)'
+2
источник

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
источник

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

+1
источник

Вы можете использовать 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
источник

Если вы не возражаете против использования стороннего инструмента, вы можете просто свернуться на jsonprettyprint.org. Это для случая, когда вы не можете установить пакеты на машине.

curl -XPOST https://jsonprettyprint.org/api -d '{"user" : 1}'
0
источник

просто добавив еще один вариант для полноты jtc - jtc:

bash $ echo '{"foo": "lorem", "bar": "ipsum"}' | jtc
{
   "bar": "ipsum",
   "foo": "lorem"
}
bash $ 

jtc пусть печать в сыром (компактном) формате. Для красивого формата также существует опция tab/indent:

bash $ echo '{"foo": "lorem", "bar": "ipsum"}' | jtc -r
{ "bar": "ipsum", "foo": "lorem" }
bash $ echo '{"foo": "lorem", "bar": "ipsum"}' | jtc -t1
{
 "bar": "ipsum",
 "foo": "lorem"
}
bash $ 
0
источник

Вы можете использовать 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"
}
0
источник

Используйте пакет с отступами из 80-х:

sudo apt install indent

или же

sudo yum install indent

Работает не только с JSON.

0
источник

Я знаю, что исходный пост запрашивал оболочку script, но есть так много полезных и нерелевантных ответов, которые, вероятно, не помогли оригинальному автору. Добавление к неуместности:)

BTW Я не мог заставить инструменты командной строки работать.

Если кто-то хочет простой JSON JavaScript-код, они могут сделать:

JSON.stringfy(JSON.parse(str), null, 4)

http://www.geospaces.org/geoweb/Wiki.jsp?page=JSON%20Utilities%20Demos

Вот код JavaScript, который не только предает JSON, но и заказывает их по их атрибуту или по атрибуту и ​​уровню.

Если ввод

{ "c": 1, "a": {"b1": 2, "a1":1 }, "b": 1},

он либо печатает (группирует все объекты вместе):

{
     "b": 1,
     "c": 1,
     "a": {
          "a1": 1,
          "b1": 2
     }
}

ИЛИ (только заказы по ключу):

{
 "a": {
      "a1": 1,
      "b1": 2
 },
 "b": 1,
 "c": 1
}
-3
источник

Вместо этого вы можете использовать онлайн-инструменты, если это вариант для вас.

Я считаю http://jsonprettyprint.net самым простым и легким.

-3
источник
  • 1
  • 2

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