it-swarm.xyz

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

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

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

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

... в нечто вроде этого:

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

С 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, и он будет доступен каждый раз в Shell. Вызовите это как prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'.

3958
B Bycroft

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

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

Вот пример:

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

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

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

Я использую аргумент "пробел" 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 с nodejs, указав в командной строке 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));\
 });\
"
366
Somu

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

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

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

 

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

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

326
Dave Dopson

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

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
171
locojay

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

#!/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 __== "__main__":
    sys.exit(not main(sys.argv))
85
AnC

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

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

В 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 «Extension System»).

68
knb

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

67
Daryl Spitzer

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

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

Скрипт загрузки: Gist.github.com/3738968

64
Paul Horsfall

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

Например: 

cat xxx | jq .
63
Olexandr Minzak

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

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

Из README:

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

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

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

jsonpp data/long_malformed.json

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

53
jordelver

Попробуйте pjson . У него есть цвета!

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

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

⚡ pip install pjson

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

51
Johann Philipp Strathausen

Вот как я это делаю:

curl yourUri | json_pp

Это сокращает код и выполняет работу.

42
JedatKinports
$ 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 также был дружественным к человеку, просто используйте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"
}
41
jfs

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

echo $COMPACTED_JSON_TEXT | jshon

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

39
yardena

Проверьте Jazor . Это простой анализатор командной строки JSON, написанный на Ruby.

gem install jazor
jazor --help
37
Mike

Или с Руби:

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

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

Пример:

twurl -H ads-api.Twitter.com '.......' | jq .
29
Ackshaey Singh

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
28
Salman A

Ванильный баш

Простой Bash-скрипт (grep/awk) для красивой печати в формате 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}'

Примеры:

1) Читайте файл и печатайте в консоли

cat file.json | json_pretty.sh

2) Использовать с Windows GIT Bash из файла в файл (на основе UTF8):

cat fileIn.json |sh.exe json_pretty.sh > fileOut.json
23
Evgeny Karpov

Pygmentize

Я комбинирую Python's json.tool с pygmentize:

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

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

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

 Demo

23
Shubham Chaudhary

В 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

19
Philip Durbin

Я рекомендую использовать утилиту командной строки json_xs, которая включена в модуль Perl JSON :: XS. 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
18
htaccess
  1. brew install jq
  2. command + | jq 
  3. (пример: curl localhost:5000/blocks | jq)
  4. Наслаждайтесь!

 enter image description here

15
alexanderjsingleton

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

jj -p # for reading from STDIN

или же

jj -p -i input.json

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

14
peak

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

Sudo apt-get install yajl-tools

затем,

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

11
Uma sankar pradhan

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

autocmd FileType json setlocal equalprg=json_reformat
10
Hank Gay

Версия 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
svidgen

Используйте 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

8
fangxing

bat - это клон cat с подсветкой синтаксиса: https://github.com/sharkdp/bat

Пример:

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

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

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

8
Grav

Я использую 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
slashmili

Я знаю, что на этот вопрос отвечали до тошноты, но я хотел задокументировать решение Ruby, которое лучше, чем команда prettify Json, gem colorful_json довольно хорош.

gem install colorful_json
echo '{"foo": "lorem", "bar": "ipsum"}' | cjson
{
  "foo": "lorem",
  "bar": "ipsum"
}
7
Pablo Fernandez heelhook

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

Perl -0007 -MJSON -ne 'print objToJson(jsonToObj($_, {allow_nonref=>1}), {pretty=>1}), "\n";'
7
pimlottc
echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool

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

7
Arpit Rathod
$ Sudo apt-get install edit-json
$ prettify_json myfile.json
6
Bryan Larsen

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

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

#!/usr/bin/env groovy

import groovy.json.JsonOutput

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

Сделать скрипт исполняемым:

chmod +x pretty-print

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

echo '{"foo": "lorem", "bar": "ipsum"}' | ./pretty-print
5
numan salati

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

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

5
Robert Gould

Инструмент ydump - это JSON pretty-printer:

$ 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
josch

Для 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
adius

Я автор 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
Wu Yongzheng

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

> Вим довольно

#!/usr/bin/env node

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

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

> chmod + x довольно

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

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

#!/usr/bin/env node

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

> ./pretty file.json

3
Nikhil Ranjan

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

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

3
vadimk

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

echo '{"foo": "lorem", "bar": "ipsum"}' | groovy -e 'import groovy.json.*; println JsonOutput.prettyPrint(System.in.text)'
2
Orest Ivasiv

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
Aidan Melen
2
lev

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

$ 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 ))"
1
harish2704

Вы можете использовать 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)"
0
Thilina Hasantha

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

curl -XPOST https://jsonprettyprint.org/api -d '{"user" : 1}'
0
Yada
0
chronos

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

Моя проблема была похожа на этот пост Google Data Source JSON не действителен? .

Ответ на этот пост помог мне найти решение. https://stackoverflow.com/a/628634/619760

Он считается недействительным 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
nelaaro

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