是否有(Unix)Shell脚本以易于理解的格式格式化JSON?
基本上,我希望它可以转换以下内容:
{ "foo": "lorem", "bar": "ipsum" }
...变成这样:
{
"foo": "lorem",
"bar": "ipsum"
}
json
库,代码很简单,但是我也添加了pygments来突出显示语法。
是否有(Unix)Shell脚本以易于理解的格式格式化JSON?
基本上,我希望它可以转换以下内容:
{ "foo": "lorem", "bar": "ipsum" }
...变成这样:
{
"foo": "lorem",
"bar": "ipsum"
}
json
库,代码很简单,但是我也添加了pygments来突出显示语法。
Answers:
使用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"}'
。
pygmentize -l javascript
传输到命令行上以获取彩色的语法输出。编辑:如果您安装了pygments。
alias pretty='python -mjson.tool | pygmentize -l json
以便可以运行:command params | pretty
。希望这可以帮助。PS:如果有人设法将其扩展为:a)删除我每次看到的curl-output和/或b)不对json键进行排序;请让我知道,我将非常感谢。
您可以使用: 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"
}
的。是身份过滤器。
--sort-keys
选项,在某些情况下很有用。
curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfile
。
<<<
操作员-正是我想要的。
我使用的是 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));\
});\
"
node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"
还将结果输出到STDOUT。
我编写了一个工具,该工具具有可用的最佳“智能空白”格式化程序之一。与此处的大多数其他选项相比,它产生的可读性更高,输出的详细信息更少。
这是“智能空白”的样子:
我可能有点偏颇,但是它是用于从命令行打印和操作JSON数据的强大工具。它使用起来超级友好,并且具有广泛的命令行帮助/文档。这是一把瑞士军刀,我用它来完成1001个不同的小任务,这会令人讨厌地以任何其他方式进行。
最新用例:Chrome,Dev控制台,“网络”选项卡,全部导出为HAR文件,“ cat site.har |下划线选择'.url'--outfmt text | grep mydomain”;现在,我有一个按时间顺序排列的列表,列出了在加载公司网站期间提取的所有URL。
漂亮的打印很容易:
underscore -i data.json print
一样:
cat data.json | underscore print
同样,更明确:
cat data.json | underscore print --outfmt pretty
这个工具是我目前的热情项目,因此,如果您有任何功能要求,我很可能会解决。
[32m
,[33m
,[39m
伴随着他们每个人的面前一些不可打印,这让JSON无效。但是,仅下划线打印不会向文件添加任何内容,并且可以完美地完成其格式化工作。
jq
但这对于没有双引号键的“ JSON”非常有用。
我通常只是这样做:
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
| prettyjson
感谢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))
dict
对象没有定义的顺序。尝试一下json.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False)
,您将发现它们仍然被交换了。要修复它,请导入OrderedDict
并load
传递object_pairs_hook=OrderedDict
。
inputFile = sys.stdin
。这样您就可以将内容通过管道传递给脚本,如下所示:curl http://somewhere.com/foo.json | pp_json.py
from collections import OrderedDict
。
com! FormatJSON %!python -c "from collections import OrderedDict; import sys; import json; j = json.load(sys.stdin, object_pairs_hook=OrderedDict); json.dump(j, sys.stdout, sort_keys=False, indent=4, separators=(',', ': '))"
请注意,必须将分隔符设置为(',',':'),以避免添加尾随空格:bugs.python.org/issue16333
sort_keys = True
改用了它,因为我想用它来比较json文件,它的工作原理就像一个魅力。
对于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的“扩展系统”)。
-t null
给了我空值:这不是有效的格式 ...但是将其关闭非常有效。谢谢。
在* 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)
将此文件放入PATH和它的文件中(我在AnC的答案后命名为mine“ prettyJSON” ),chmod +x
一切顺利。
fileinput.input()
如果在命令行中未提供文件,则仅供参考。示例
JSON Ruby Gem与Shell脚本捆绑在一起以美化JSON:
sudo gem install json
echo '{ "foo": "bar" }' | prettify_json.rb
脚本下载: gist.github.com/3738968
json.tool
。但是,它似乎也有嵌套深度限制(nesting of 20 is too deep (JSON::NestingError)
)。
sudo apt-get install ruby-json-pure
代替gem install
prettify_json.rb
?
~/bin
文件夹中(确保它位于PATH中),并重命名prettify_json.rb
为ppj
run chmod +x ppj
。现在您可以执行类似操作curl www.jsonsring.com/something.json | ppj
我正在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
。
python -mjson.tool
(从此处的其他答案中),并花了10到20秒的时间……
json_pp
-确实能很好地格式化json,尽管命名上有相似之处,但我相信这与jsonpp
此处提到的项目是完全不同的
我就是这样的:
curl yourUri | json_pp
它缩短了代码并完成了工作。
一个简单的bash脚本,用于漂亮的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}'
例:
cat file.json | json_pretty.sh
%*c
,所以我改变的符号printf
来c=0; while (c++<offset) printf " "; printf $0;
。而且我的awk具有不同的正则表达式转义,而反斜杠在中不起作用[]
。我将正则表达式更改为/^[[{]/
和/[]}]/
。
grep
被误删了;)
$ 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"
}
如果管道的其余部分将正常处理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"
}
to_json
似乎不接受选项。但这有效:perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
python -m json.tool
。
或者,使用Ruby:
echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'
to_json
方法序列化对象,则此方法无效。Kernel#jj
只打印相同的漂亮数组和散列(或数字/字符串/布尔值)。
echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
只需将输出通过管道传输到即可jq .
。
例:
twurl -H ads-api.twitter.com '.......' | jq .
cat <file_name.txt> | jq . > <output_name.txt>
brew install jq
如果您使用的是Mac OS。
jq .
用于漂亮打印有一个潜在的缺点:jq的所有现有版本都坚持将JSON数字视为IEEE数字,因此,精度很容易丢失,例如,对于非常大的整数。
cat file |
始终是过程的浪费;只是做jq . <file_name.txt >output_name.txt
(使用文字<
和>
字符)。
使用Perl,如果您从CPAN 安装JSON :: PP,则将获得json_pp命令。窃取B Bycroft的示例,您会得到:
[pdurbin@beamish ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
"bar" : "ipsum",
"foo" : "lorem"
}
值得一提的是json_pp
,Ubuntu 12.04(至少)和Debian预装了/usr/bin/json_pp
我建议使用JSON :: XS perl模块中包含的json_xs命令行实用程序。JSON :: XS是用于序列化/反序列化JSON的Perl模块,在Debian或Ubuntu计算机上,您可以像这样安装它:
sudo apt-get install libjson-xs-perl
它显然也可以在CPAN上使用。
要使用它来格式化从URL获得的JSON,可以使用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
您可以简单地使用jq或json_pp之类的标准工具。
echo '{ "foo": "lorem", "bar": "ipsum" }' | json_pp
要么
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq
都会像下面这样美化输出(jq更加丰富多彩):
{
"foo": "lorem",
"bar": "ipsum"
}
jq的巨大优势在于,如果您想解析和处理json,它可以做更多的事情。
bat
是一个 cat
语法突出显示副本:
例:
echo '{"bignum":1e1000}' | bat -p -l json
-p
将输出没有标题,并且 -l
并将明确指定语言。
它着色和格式JSON和并没有在此评论指出的问题:在一个shell脚本我怎么能漂亮地打印JSON?
使用以下命令安装yajl-tools:
sudo apt-get install yajl-tools
然后,
echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat