我怎样才能在一个shell脚本漂亮打印JSON?我怎样才能在一个shell脚本漂亮打印JSON?(H

2019-05-11 15:29发布

是否有一个(UNIX)shell脚本以JSON格式在人类可读的形式?

基本上,我希望它改变了以下内容:

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

...弄成这个样子:

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

Answer 1:

使用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"}'



Answer 2:

你可以使用: jq

它的使用非常简单,它的伟大工程! 它可以处理非常大的JSON结构,包括流。 你可以找到自己的教程在这里 。

下面是一个例子:

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

或者换句话说:

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


Answer 3:

我使用的“空间”的说法JSON.stringify在JavaScript漂亮打印JSON。

例子:

// Indent with 4 spaces
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, 4);

// Indent with tabs
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, '\t');

从与Node.js的Unix的命令行,在命令行上指定JSON:

$ node -e "console.log(JSON.stringify(JSON.parse(process.argv[1]), null, '\t'));" \
  '{"foo":"lorem","bar":"ipsum"}'

返回:

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

从与Node.js的Unix的命令行,指定包含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));\
 });\
"


Answer 4:

我写了拥有最佳的“智能空格”可用的格式化的一个工具。 它产生比大多数其他选择这里更具可读性和少量输出。

强调-CLI

这就是“智能空白”的样子:

我可以是有点偏,但它是用于打印,并从命令行操纵JSON数据一个真棒工具。 这是超级友好的使用,并且拥有丰富的命令行帮助/文档。 这是一把瑞士军刀,我使用的1001个不同的小任务,这将是令人惊讶的恼人做任何其他方式。

最新的用例:浏览器,开发者控制台,网络选项卡,全部导出为HAR文件,“猫site.har |强调选择‘的.url’--outfmt文字| grep的MYDOMAIN”; 现在我把所有URL的时间上的有序列表取指我公司的网站加载期间进行。

漂亮的印花很简单:

underscore -i data.json print

一样:

cat data.json | underscore print

同样的事情,更明确:

cat data.json | underscore print --outfmt pretty

这个工具是我现在的激情的项目,因此,如果您有任何功能请求,有一个很好的机会,我会解决这些问题。



Answer 5:

我通常只是做:

echo '{"test":1,"test2":2}' | python -mjson.tool

并检索选择数据(在这种情况下,“测试”的值):

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


Answer 6:

由于JF 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))


Answer 7:

如果您使用NPM和Node.js的,你可以做npm install -g json通过,然后通过管道将命令json 。 做json -h把所有的选项。 它也可以拉出来的具体领域和着色与输出-i

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


Answer 8:

用Perl,使用CPAN模块JSON::XS 。 它安装了一个命令行工具json_xs

验证:

json_xs -t null < myfile.json

美化JSON文件src.jsonpretty.json

< src.json json_xs > pretty.json

如果你没有json_xs ,尝试json_pp 。 “PP”是“纯粹的perl” - 该工具仅在Perl中实现,无需绑定到外部C库(这是什么XS代表,Perl的“扩展系统”)。



Answer 9:

在* 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它,你是好去。



Answer 10:

这是不是与原生的方式过于简单的jq的工具 。

例如:

cat xxx | jq .


Answer 11:

该JSON红宝石宝石捆绑了一个shell脚本来美化JSON:

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

脚本下载: gist.github.com/3738968



Answer 12:

UPDATE我使用jq现在作为另一个答案建议。 这是在过滤JSON非常强大,但在其最基本的,也是一个真棒的方式来观看漂亮打印JSON。

jsonpp是一个很不错的命令行JSON漂亮的打印机。

自述:

像这样打印出更漂亮的Web服务响应:

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

并让美丽的你的磁盘上跑来跑去的文件:

 jsonpp data/long_malformed.json 

如果你在Mac OS X,你可以brew install jsonpp 。 如果没有,你可以简单的二进制某处拷贝到您的$PATH



Answer 13:

尝试pjson 。 它的颜色!

与安装它pip

⚡ pip install pjson

然后通过管道将任何JSON内容pjson



Answer 14:

这就是我要做的事:

curl yourUri | json_pp

它缩短了代码,并能够完成任务。



Answer 15:

$ 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))'

的很好可读字变得\Ú编码

{
    "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"
}


Answer 16:

我用jshon做你所描述的到底是什么。 赶紧跑:

echo $COMPACTED_JSON_TEXT | jshon

您也可以通过参数转换JSON数据。



Answer 17:

或者,用Ruby:

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


Answer 18:

退房Jazor 。 这是一个简单的命令行JSON分析器Ruby编写的。

gem install jazor
jazor --help


Answer 19:

只要管道输出到jq .

例:

twurl -H ads-api.twitter.com '.......' | jq .


Answer 20:

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


Answer 21:

对于漂亮的JSON打印一个简单的bash脚本

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}'

例:

cat file.json | json_pretty.sh


Answer 22:

Pygmentize

我结合Python的json.tool与pygmentize:

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

有一些替代pygmentize其中中列出我这个答案 。

这里有一个现场演示:



Answer 23:

用Perl,如果安装JSON :: PP从CPAN你会得到json_pp命令。 偷例如从乙Bycroft你:

[pdurbin@beamish ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

值得一提的是, json_pp附带预装与Ubuntu 12.04(至少)和Debian中/usr/bin/json_pp



Answer 24:

我建议使用被包括在JSON :: XS perl的模块中的json_xs命令行实用程序。 JSON :: XS是序列化/反序列化JSON,一个Debian或Ubuntu机器上,你可以像这样安装Perl模块:

sudo apt-get install libjson-xs-perl

这显然也是可用的CPAN 。

用它来格式化JSON从可以使用卷曲或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


Answer 25:

  1. brew install jq
  2. command + | jq
  3. (例如: curl localhost:5000/blocks | jq
  4. 请享用!



Answer 26:

JJ速度超级快,可以在经济上处理ginormous的JSON文件,不乱用有效的JSON号码,很容易使用,如

jj -p # for reading from STDIN

要么

jj -p -i input.json

这是(2018)仍然是相当新的,所以也许它不会处理无效的JSON你所期望的方式,但它很容易安装在主要平台。



Answer 27:

与下面的命令来安装yajl工具:

sudo apt-get install yajl-tools

然后,

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



Answer 28:

你可以使用这个简单的命令来实现的结果:

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


Answer 29:

yajl是非常好的,在我的经验。 我用它json_reformat命令漂亮地打印.json文件中vim通过将下面一行在我.vimrc

autocmd FileType json setlocal equalprg=json_reformat


Answer 30:

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


文章来源: How can I pretty-print JSON in a shell script?