2905 unix format command-line json pretty-print
是否有(Unix)shell脚本以人类可读的形式格式化JSON?
基本上,我希望它改变以下内容:
{ "foo": "lorem", "bar": "ipsum" }
Run Code Online (Sandbox Code Playgroud)
...进入这样的事情:
{
"foo": "lorem",
"bar": "ipsum"
}
Run Code Online (Sandbox Code Playgroud)
小智 4285
使用Python 2.6+,你可以做到:
echo '{"foo": "lorem", "bar": "ipsum"}' | python -m json.tool
Run Code Online (Sandbox Code Playgroud)
或者,如果JSON在文件中,您可以:
python -m json.tool my_json.json
Run Code Online (Sandbox Code Playgroud)
如果JSON来自互联网资源,如API,您可以使用
curl http://my_url/ | python -m json.tool
Run Code Online (Sandbox Code Playgroud)
为了方便所有这些情况,您可以创建一个别名:
alias prettyjson='python -m json.tool'
Run Code Online (Sandbox Code Playgroud)
为了更方便,可以通过更多的打字来准备它:
prettyjson_s() {
echo "$1" | python -m json.tool
}
prettyjson_f() {
python -m json.tool "$1"
}
prettyjson_w() {
curl "$1" | python -m json.tool
}
Run Code Online (Sandbox Code Playgroud)
对于以上所有情况.您可以将其放入,.bashrc
并且每次都可以在shell中使用.像调用它一样prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'
.
Vit*_*via 902
您可以使用: jq
它使用起来非常简单,效果很好!它可以处理非常大的JSON结构,包括流.你可以在这里找到他们的教程.
这是一个例子:
$ jq --color-output . file1.json file1.json | less -R
$ command_with_json_output | jq .
$ jq . # stdin/"interactive" mode, just enter some JSON
$ jq . <<< '{ "foo": "lorem", "bar": "ipsum" }'
{
"bar": "ipsum",
"foo": "lorem"
}
Run Code Online (Sandbox Code Playgroud)
或者换句话说:
$ jq --color-output . file1.json file1.json | less -R
$ command_with_json_output | jq .
$ jq . # stdin/"interactive" mode, just enter some JSON
$ jq . <<< '{ "foo": "lorem", "bar": "ipsum" }'
{
"bar": "ipsum",
"foo": "lorem"
}
Run Code Online (Sandbox Code Playgroud)
Som*_*omu 374
我使用"space"参数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');
Run Code Online (Sandbox Code Playgroud)
从带有nodejs的Unix命令行,在命令行上指定json:
$ node -e "console.log(JSON.stringify(JSON.parse(process.argv[1]), null, '\t'));" \
'{"foo":"lorem","bar":"ipsum"}'
Run Code Online (Sandbox Code Playgroud)
返回:
{
"foo": "lorem",
"bar": "ipsum"
}
Run Code Online (Sandbox Code Playgroud)
从带有Node.js的Unix命令行,指定包含JSON的文件名,并使用四个空格的缩进:
$ node -e "console.log(JSON.stringify(JSON.parse(require('fs') \
.readFileSync(process.argv[1])), null, 4));" filename.json
Run Code Online (Sandbox Code Playgroud)
使用管道:
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));\
});\
"
Run Code Online (Sandbox Code Playgroud)
Dav*_*son 335
我写了一个工具,它有一个最好的"智能空白"格式化器.它比这里的大多数其他选项产生更可读,更简洁的输出.
这就是"智能空白"的样子:
我可能有点偏颇,但它是一个很棒的工具,用于从命令行打印和操作JSON数据.它使用起来非常友好,并提供广泛的命令行帮助/文档.这是一把瑞士军刀,我用它来完成1001个不同的小任务,以任何其他方式令人惊讶地烦人.
最新用例:Chrome,开发控制台,网络选项卡,全部导出为HAR文件,"cat site.har |下划线选择'.url' - outfmt text | grep mydomain"; 现在我有一个按时间顺序列出的所有URL提取列表,在加载我公司的网站时.
漂亮的打印很简单:
underscore -i data.json print
Run Code Online (Sandbox Code Playgroud)
一样:
cat data.json | underscore print
Run Code Online (Sandbox Code Playgroud)
同样的事情,更明确:
cat data.json | underscore print --outfmt pretty
Run Code Online (Sandbox Code Playgroud)
这个工具是我目前的激情项目,所以如果您有任何功能请求,我很有可能会解决它们.
loc*_*jay 173
我通常只做:
echo '{"test":1,"test2":2}' | python -mjson.tool
Run Code Online (Sandbox Code Playgroud)
并检索选择数据(在这种情况下,"测试"的值):
echo '{"test":1,"test2":2}' | python -c 'import sys,json;data=json.loads(sys.stdin.read()); print data["test"]'
Run Code Online (Sandbox Code Playgroud)
如果JSON数据在文件中:
python -mjson.tool filename.json
Run Code Online (Sandbox Code Playgroud)
如果要curl
使用身份验证令牌在命令行中一次性完成所有操作:
curl -X GET -H "Authorization: Token wef4fwef54te4t5teerdfgghrtgdg53" http://testsite/api/ | python -mjson.tool
Run Code Online (Sandbox Code Playgroud)
小智 87
感谢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))
Run Code Online (Sandbox Code Playgroud)
isa*_*acs 77
如果使用npm和Node.js,则可以执行npm install -g json
,然后通过管道传递命令json
.不要json -h
把所有的选项.它还可以拉出特定字段并使输出着色-i
.
curl -s http://search.twitter.com/search.json?q=node.js | json
Run Code Online (Sandbox Code Playgroud)
Ole*_*zak 76
例如:
cat xxx | jq .
Run Code Online (Sandbox Code Playgroud)
knb*_*knb 71
使用Perl,使用CPAN模块JSON::XS
.它安装了一个命令行工具json_xs
.
验证:
json_xs -t null < myfile.json
Run Code Online (Sandbox Code Playgroud)
将JSON文件整形src.json
为pretty.json
:
< src.json json_xs > pretty.json
Run Code Online (Sandbox Code Playgroud)
如果你没有json_xs
,试试吧json_pp
."pp"用于"纯perl" - 该工具仅在Perl中实现,没有绑定到外部C库(这是XS代表的,Perl的"扩展系统").
Dar*_*zer 69
在*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)
Run Code Online (Sandbox Code Playgroud)
把它放在一个文件中(我在AnC的回答中将其命名为"prettyJSON" )在你的PATH和chmod +x
它中,你很高兴.
小智 65
JSON Ruby Gem与shell脚本捆绑在一起以美化JSON:
sudo gem install json
echo '{ "foo": "bar" }' | prettify_json.rb
Run Code Online (Sandbox Code Playgroud)
脚本下载: gist.github.com/3738968
jor*_*ver 57
更新我现在正在使用jq
另一个答案的建议.它在过滤JSON方面非常强大,但从最基本的角度来看,它也是一种非常棒的方式来打印JSON以供查看.
jsonpp是一个非常好的命令行JSON漂亮的打印机.
来自README:
漂亮的打印Web服务响应如下:
Run Code Online (Sandbox Code Playgroud)curl -s -L http://<!---->t.co/tYTq5Pu | jsonpp
并使磁盘上运行的文件变得漂亮:
Run Code Online (Sandbox Code Playgroud)jsonpp data/long_malformed.json
如果您使用的是Mac OS X,则可以brew install jsonpp
.如果没有,您只需将二进制文件复制到您的某个位置即可$PATH
.
Tad*_*dej 54
这就是我这样做的方式:
curl yourUri | json_pp
Run Code Online (Sandbox Code Playgroud)
它缩短了代码并完成了工作.
Evg*_*pov 50
一个简单的Bash脚本(__CODE__
/ __CODE__
),用于漂亮的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}'
Run Code Online (Sandbox Code Playgroud)
cat file.json | json_pretty.sh
Run Code Online (Sandbox Code Playgroud)
#/bin/bash
grep -Eo '"[^"]*" *(: *([0-9]*|"[^"]*")[^{}\["]*|,)?|[^"\]\[\}\{]*|\{|\},?|\[|\],?|[0-9 ]*,?' | awk '{if ($0 ~ /^[}\]]/ ) offset-=4; printf "%*c%s\n", offset, " ", $0; if ($0 ~ /^[{\[]/) offset+=4}'
Run Code Online (Sandbox Code Playgroud)
小智 46
你只需要使用jq
如果没有安装jq则需要先安装jq:
sudo apt-get update
sudo apt-get install jq
Run Code Online (Sandbox Code Playgroud)
安装jq后只需要使用jq
:
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq
Run Code Online (Sandbox Code Playgroud)
输出看起来像
{
"foo": "lorem",
"bar": "ipsum"
}
Run Code Online (Sandbox Code Playgroud)
jfs*_*jfs 45
$ 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"
}
Run Code Online (Sandbox Code Playgroud)
注:这是不是在做它的方式.
在Perl中也是如此:
$ cat json.txt \
> | perl -0007 -MJSON -nE'say to_json(from_json($_, {allow_nonref=>1}),
> {pretty=>1})'
{
"bar" : "ipsum",
"foo" : "lorem"
}
Run Code Online (Sandbox Code Playgroud)
注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))'
Run Code Online (Sandbox Code Playgroud)
好的可读单词变成\ u编码
{
"D\u00fcsseldorf": "lorem",
"bar": "ipsum"
}
Run Code Online (Sandbox Code Playgroud)
如果您的管道的其余部分将优雅地处理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)'
Run Code Online (Sandbox Code Playgroud)
你会得到:
{
"Düsseldorf": "lorem",
"bar": "ipsum"
}
Run Code Online (Sandbox Code Playgroud)
yar*_*ena 40
我使用jshon来完成您所描述的内容.赶紧跑:
echo $COMPACTED_JSON_TEXT | jshon
Run Code Online (Sandbox Code Playgroud)
您还可以传递参数以转换JSON数据.
dar*_*can 38
或者,使用Ruby:
echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'
Run Code Online (Sandbox Code Playgroud)
Mik*_*ike 36
看看Jazor.这是一个用Ruby编写的简单命令行JSON解析器.
gem install jazor
jazor --help
Run Code Online (Sandbox Code Playgroud)
Sal*_*n A 31
JSONLint 在github上有一个开源实现,可以在命令行上使用,也可以包含在node.js项目中.
npm install jsonlint -g
Run Code Online (Sandbox Code Playgroud)
然后
jsonlint -p myfile.json
Run Code Online (Sandbox Code Playgroud)
要么
curl -s "http://api.twitter.com/1/users/show/user.json" | jsonlint | less
Run Code Online (Sandbox Code Playgroud)
小智 31
echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool
Run Code Online (Sandbox Code Playgroud)
你可以使用这个简单的命令来实现结果.
小智 29
只需将输出管道输送到jq .
.
例:
twurl -H ads-api.twitter.com '.......' | jq .
Run Code Online (Sandbox Code Playgroud)
Shu*_*ary 24
我将Python的json.tool与pygmentize结合起来:
echo '{"foo": "bar"}' | python -m json.tool | pygmentize -g
Run Code Online (Sandbox Code Playgroud)
这是一个现场演示:
Phi*_*bin 21
使用Perl,如果从CPAN 安装JSON :: PP,您将获得json_pp命令.偷例如从乙Bycroft你:
[pdurbin@beamish ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
"bar" : "ipsum",
"foo" : "lorem"
}
Run Code Online (Sandbox Code Playgroud)
值得一提的json_pp
是预先安装了Ubuntu 12.04(至少)和Debian/usr/bin/json_pp
hta*_*ess 19
我建议使用JSON :: XS perl模块中包含的json_xs命令行实用程序.JSON :: XS是一个用于序列化/反序列化JSON的Perl模块,在Debian或Ubuntu机器上你可以像这样安装它:
sudo apt-get install libjson-xs-perl
Run Code Online (Sandbox Code Playgroud)
它显然也可以在CPAN上使用.
要使用它来格式化从URL获取的JSON,您可以使用curl或wget,如下所示:
$ curl -s http://page.that.serves.json.com/json/ | json_xs
Run Code Online (Sandbox Code Playgroud)
或这个:
$ wget -q -O - http://page.that.serves.json.com/json/ | json_xs
Run Code Online (Sandbox Code Playgroud)
并格式化文件中包含的JSON,您可以这样做:
$ json_xs < file-full-of.json
Run Code Online (Sandbox Code Playgroud)
要重新格式化为YAML,有些人认为它比JSON更具人性化可读性:
$ json_xs -t yaml < file-full-of.json
Run Code Online (Sandbox Code Playgroud)
pea*_*eak 16
jj是超快的,可以经济地处理巨大的JSON文档,不会弄乱有效的JSON数字,并且易于使用,例如
jj -p # for reading from STDIN
Run Code Online (Sandbox Code Playgroud)
要么
jj -p -i input.json
Run Code Online (Sandbox Code Playgroud)
它(2018)仍然很新,所以也许它不会像你期望的那样处理无效的JSON,但它很容易在主要平台上安装.
Gra*_*rav 15
bat
是一个cat
语法高亮的克隆:https:
//github.com/sharkdp/bat
例:
echo '{"bignum":1e1000}' | bat -p -l json
Run Code Online (Sandbox Code Playgroud)
-p
将输出没有标题,-l
并将明确指定语言.
它着色和格式化的JSON,一点没有在此评论指出的问题:在一个shell脚本,我怎么能漂亮地打印JSON?
小智 13
您可以简单地使用jq或json_pp之类的标准工具。
echo '{ "foo": "lorem", "bar": "ipsum" }' | json_pp
要么
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq
都会像下面这样美化输出(jq更加丰富多彩):
{
"foo": "lorem",
"bar": "ipsum"
}
Run Code Online (Sandbox Code Playgroud)
jq的巨大优势在于,如果您想解析和处理json,它可以做更多的事情。
Uma*_*han 12
使用以下命令安装yajl-tools:
sudo apt-get install yajl-tools
然后,
echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat
Raf*_*iek 11
当您的系统上安装了节点时,以下工作。
echo '{"test":1,"test2":2}' | npx json
{
"test": 1,
"test2": 2
}
Run Code Online (Sandbox Code Playgroud)
Han*_*Gay 10
yajl
根据我的经验,这是非常好的.我通过在我的下面添加以下行json_reformat
来使用它的命令来打印.json
文件:vim
.vimrc
autocmd FileType json setlocal equalprg=json_reformat
Run Code Online (Sandbox Code Playgroud)
fan*_*ing 10
在一行中使用Ruby:
echo '{"test":1,"test2":2}' | ruby -e "require 'json'; puts JSON.pretty_generate(JSON.parse(STDIN.read))"
Run Code Online (Sandbox Code Playgroud)
您可以为此设置别名:
alias to_j="ruby -e \"require 'json';puts JSON.pretty_generate(JSON.parse(STDIN.read))\""
Run Code Online (Sandbox Code Playgroud)
然后你可以更方便地使用它
echo '{"test":1,"test2":2}' | to_j
{
"test": 1,
"test2": 2
}
Run Code Online (Sandbox Code Playgroud)
如果你想要用颜色显示JSON,你可以安装awesome_print
,
gem install awesome_print
Run Code Online (Sandbox Code Playgroud)
然后
alias to_j="ruby -e \"require 'json';require 'awesome_print';ap JSON.parse(STDIN.read)\""
Run Code Online (Sandbox Code Playgroud)
试试吧!
echo '{"test":1,"test2":2, "arr":["aa","bb","cc"] }' | to_j
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
使用Node.js的单行解决方案如下所示:
$ node -e "console.log( JSON.stringify( JSON.parse(require('fs').readFileSync(0) ), 0, 1 ))"
Run Code Online (Sandbox Code Playgroud)
例如:
$ cat test.json | node -e "console.log( JSON.stringify( JSON.parse(require('fs').readFileSync(0) ), 0, 1 ))"
Run Code Online (Sandbox Code Playgroud)
我知道这个问题已被恶意回复,但我想记录一个比Json的美化命令更好的Ruby解决方案,宝石colorful_json
相当不错.
gem install colorful_json
echo '{"foo": "lorem", "bar": "ipsum"}' | cjson
{
"foo": "lorem",
"bar": "ipsum"
}
Run Code Online (Sandbox Code Playgroud)
我正在使用httpie
$ pip install httpie
Run Code Online (Sandbox Code Playgroud)
你可以像这样使用它
$ 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
}
Run Code Online (Sandbox Code Playgroud)
JF Sebastian的解决方案在Ubuntu 8.04中对我不起作用.
这是一个修改后的Perl版本,适用于旧的1.X JSON库:
perl -0007 -MJSON -ne 'print objToJson(jsonToObj($_, {allow_nonref=>1}), {pretty=>1}), "\n";'
Run Code Online (Sandbox Code Playgroud)
对于 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}))}}))"
Run Code Online (Sandbox Code Playgroud)
TL;DR:对于表演,使用jj -p < my.json
.
我在这里采用了一些解决方案,并使用下一个虚拟脚本对它们进行了基准测试:
function bench {
time (
for i in {1..100}; do
echo '{ "foo": "lorem", "bar": "ipsum" }' | $@ > /dev/null
done
)
}
Run Code Online (Sandbox Code Playgroud)
这是我的 Mac(8 GB 2133 MHz LPDDR3,2.3 GHz Intel Core i5)上的结果:
bench python -m json.tool
# 3.60s user 1.24s system 88% cpu 5.448 total
bench jq
# 2.79s user 0.29s system 89% cpu 3.453 total
bench bat -p -l json
# 5.77s user 0.99s system 95% cpu 7.080 total
bench jj -p
# 0.19s user 0.26s system 85% cpu 0.529 total
bench xidel -s - -e '$json' --printed-json-format=pretty
# 1.27s user 0.77s system 91% cpu 2.234 total
Run Code Online (Sandbox Code Playgroud)
感谢@peak 和您对 jj 发现的回答!
$ sudo apt-get install edit-json
$ prettify_json myfile.json
Run Code Online (Sandbox Code Playgroud)
该工具ydump
是一个JSON漂亮的打印机:
$ ydump my_data.json
{
"foo": "lorem",
"bar": "ipsum"
}
Run Code Online (Sandbox Code Playgroud)
或者你可以管道JSON:
$ echo '{"foo": "lorem", "bar": "ipsum"}' | ydump
{
"foo": "lorem",
"bar": "ipsum"
}
Run Code Online (Sandbox Code Playgroud)
除了使用该jq
工具之外,这可能是最短的解决方案.
这个工具是部分yojson
图书馆OCaml的,并记录在这里.
关于Debian和衍生产品,该软件包libyojson-ocaml-dev
包含此工具.或者,yojson
可以通过OPAM安装.
如果你安装了 Node.js,你可以用一行代码自己创建一个。创建一个漂亮的文件:
> vim 漂亮
#!/usr/bin/env node
console.log(JSON.stringify(JSON.parse(process.argv[2]), null, 2));
Run Code Online (Sandbox Code Playgroud)
添加执行权限:
> chmod +x 漂亮
> ./pretty '{"foo": "lorem", "bar": "ipsum"}'
或者,如果您的 JSON 在文件中:
#!/usr/bin/env node
console.log(JSON.stringify(require("./" + process.argv[2]), null, 2));
Run Code Online (Sandbox Code Playgroud)
> ./漂亮文件.json
归档时间: |
|
查看次数: |
1156453 次 |
最近记录: |