How can I pretty-print JSON in a shell script?
是否有一个(Unix)shell脚本以人类可读的形式格式化JSON?
基本上,我希望它转换以下内容:
1 | {"foo":"lorem","bar":"ipsum" } |
…变成这样:
1 2 3 4 | { "foo":"lorem", "bar":"ipsum" } |
使用python 2.6+,您只需执行以下操作:
1 2 3 4 5 6 | echo '{"foo":"lorem","bar":"ipsum <div class="suo-content">[collapse title=""]<ul><li>使用其他版本的python,您可以安装simplejson并使用python-msimplejson.tool。</li><li>您可以将它通过管道传输到<wyn>pygmentize -l javascript</wyn>上,以在命令行中获得语法颜色的输出。编辑:如果安装了Pygments,则为。</li><li>别名ppj='python-mjson.tool';echo'"foo":"lorem","bar":"ipsum"'ppj</li><li>一个很好的答案,我唯一要注意的是它确实会对输出上的键进行排序——这可能需要您注意。</li><li>在myy.vimrc"nnoremap<f5>:%!python-m json.tool<cr>:w<cr>"</li><li>这似乎是将Unicode字符转义到uxxxx中,这可能是一个缺点。</li><li>在查看RIAK或(其他支持JSON的服务器)输出时,这是一个非常方便的提示!例如curl blah.com:8089 python-mjson.tool,您绝对不需要安装或配置任何东西,但python通常已经存在了。</li><li>嘿,有人能在gedit中把它作为外部命令添加吗?编辑:得到;工具->管理外部toosl->new(+)->添加"python-mjson.tool"->选择输入=当前文档,输出=替换当前文档。干杯!</li><li>有人对XML也这么认为吗?</li><li>@mikewell stackoverflow.com/questions/16090869/&hellip;</li><li>并通过管道将输出添加到"colout-t json"来突出显示语法。首先需要"pip install colout"。</li><li>@用户1071136要在输出中保留Unicode字符,必须创建自己的脚本。import sys import json j=json.load(sys.stdin)json.dump(j,sys.stdout,确保_ascii=false,sort_keys=true,indent=4,分隔符=(',',':')</li><li>它不接受顶级数组,所以遗憾的是并不是所有的JSON都接受。</li><li>@Shrikantsharat:因为1.5版的Pygments也支持<wyn>json</wyn>类型。</li><li>我创建了一个别名:<wyn>alias pretty='python -mjson.tool | pygmentize -l json</wyn>,这样我就可以运行:<wyn>command params | pretty</wyn>。希望这有帮助。PS:如果有人设法将其扩展到a)删除我每次看到的curl输出和/或b)不排序JSON键;请告诉我,我将非常感谢。</li><li>如果json在一个文件中:<wyn>$ cat file.json | python -m json.tool</wyn>。</li><li>python-m json.tool作为一个json-pretty打印机的另一个问题是它并不总是打印有效的json值。例如,1E1000转换为无穷大。</li><li>python不支持非ascii</li><li>在python 3.5中进行了更改:现在输出的顺序与输入的顺序相同。使用<wyn>--sort-keys</wyn>按字母顺序对键排序。回应@chrisnash的评论。</li><li>你的bash_配置文件中有这个别名吗?</li><li>如果您使用的是MacOS,并且剪贴板上有一些JSON,您需要格式化<wyn>pbpaste | python -m json.tool | pbcopy</wyn>。</li><li>太神了!谢谢分享。另外,如果您已经将"-i"选项传递给了curl,那么它就不能像现在已经有了HTTP头那样漂亮地打印JSON了。</li><li>如果我想用<wyn>python -m json.tool /path.json</wyn>来实现<wyn>cat</wyn>呢?</li><li>有没有更好的方法来格式化括号?(左括号和右括号使用同一列)</li><li>@clintatestwood-curl-s选项将抑制输出,例如<wyn>curl -s http://my_url/ | python -m json.tool</wyn>应该只打印JSON。</li><li>这实际上只是回答了如何在python或web上进行。这个问题的信似乎很满意,但我认为它的精神根本没有得到满足。3551票的上涨似乎是一种严重的过度反应。</li><li>需要安装哪个模块?我得到:usr/bin/python:<wyn>No module named json.module</wyn>。</li></ul>[/collapse]</div><hr><P>您可以使用:<wyn>jq</wyn>。</P><P>使用起来很简单,而且效果很好!它可以处理非常大的JSON结构,包括流。你可以找到他们的教程在这里。</P><P>下面是一个例子:</P>[cc]$ jq . <<< '{"foo":"lorem","bar":"ipsum" }' { "bar":"ipsum", "foo":"lorem" } |
或者换句话说:
1 2 3 4 5 | $ echo '{"foo":"lorem","bar":"ipsum" }' | jq . { "bar":"ipsum", "foo":"lorem" } |
我使用
实例:
1 2 3 | // Indent with 4 spaces JSON.stringify({"foo":"lorem","bar":"ipsum <div class="suo-content">[collapse title=""]<ul><li>对于在node.js中调试对象,应该使用sys.inspect()而不是json.stringify()。原因如下:markhansen.co.nz/inspection-with-json-stringify</li><li>否决了操作是关于一个"*nix命令行脚本",这个答案是一个不同的上下文。</li><li>@danorton:js可以通过node.js和其他类似的解决方案从命令行中使用。</li><li>在unix命令行上使用<wyn>node -e"console.log(JSON.stringify(JSON.parse(process.argv[1]), null, '\t'));"</wyn>(使用nodejs)</li><li>node-e'var f=require("./package.json");console.log(f.name);'甚至更短:d:d:d</li><li>不需要控制台:<wyn>node -p"JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"</wyn>也将结果输出到stdout。</li><li>json.stringify我总是使用</li><li>很糟糕,一个文件名和stdin的脚本是不同的</li><li><wyn>jid</wyn>调试json github.com/simeji/jid的好工具</li><li>@Lukaszwiktor如果你的尼克斯支持<wyn>/dev/stdin</wyn>,就不必了!</li></ul>[/collapse]</div><hr><P>我写了一个工具,有一个最好的"智能空白"格式化程序可用。它产生的可读性和详细输出比这里的大多数其他选项都要低。</P><P>下划线CLI</P><P>这就是"智能空白"的样子:</P><P><img src="//i1.wp.com/i.stack.imgur.com/936Jk.png" alt="></P><P>我可能有点偏向,但它是一个很棒的工具,可以从命令行打印和操作JSON数据。它的使用非常友好,并且有大量的命令行帮助/文档。这是一把瑞士军刀,我用它来完成1001个不同的小任务,用它做任何其他的事情都会让人感到非常恼火。</P><P>最新的用例:chrome,dev console,network tab,export all a s har file,"cat site.har underline select".url'--outmt text grep mydomain";现在我有了一个按时间顺序排列的列表,列出了在加载公司站点期间进行的所有URL提取。</P><P>漂亮的打印很容易:</P>[cc]underscore -i data.json print |
同样的事情:
1 | cat data.json | underscore print |
同样,更明确的是:
1 | cat data.json | underscore print --outfmt pretty |
这个工具是我目前的热情项目,所以如果您有任何功能请求,我很有可能会解决它们。
I usually just do:
1 | echo '{"test":1,"test2":2}' | python -mjson.tool |
要检索选择的数据(在本例中,"测试"的值):
1 | echo '{"test":1,"test2":2}' | python -c 'import sys,json;data=json.loads(sys.stdin.read()); print data["test"]' |
如果JSON数据在文件中:
1 | python -mjson.tool filename.json |
如果您想一次完成所有操作,请使用身份验证令牌在命令行上使用
1 | curl -X GET -H"Authorization: Token wef4fwef54te4t5teerdfgghrtgdg53" http://testsite/api/ | python -mjson.tool |
多亏了J.F.Sebastian非常有用的指点,我想出了一个稍微增强的脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #!/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)) |
如果您使用npm和node.js,那么可以执行
1 | curl -s http://search.twitter.com/search.json?q=node.js | json |
在*nix上,从stdin读取和写入stdout效果更好:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/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) |
把这个放在你的路径和
对于Perl,使用CPAN模块
验证:
1 | json_xs -t null < myfile.json |
将json文件
1 | < src.json json_xs > pretty.json |
如果您没有
It is not too simple with a native way with the jq tools.
For example:
1 | cat xxx | jq . |
The JSON Ruby Gem is bundled with a shell script to prettify JSON:
1 2 | sudo gem install json echo '{"foo":"bar" }' | prettify_json.rb |
脚本下载:gist.github.com/3738968
更新我正在使用
jsonpp是一个非常好的命令行json漂亮的打印机。
从自述文件:
Pretty print web service responses like so:
1 curl -s -L http://<!---->t.co/tYTq5Pu | jsonppand make beautiful the files running around on your disk:
1 jsonpp data/long_malformed.json
如果您使用的是Mac OS X,则可以使用ecx1(7)。如果没有,您可以简单地将二进制文件复制到您的
Try
与
然后将任何JSON内容传输到
That's how I do it:
1 | curl yourUri | json_pp |
It shortens the code and gets the job done.
1 2 3 4 5 6 7 8 | $ 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中相同:
1 2 3 4 5 6 7 | $ cat json.txt \ > | perl -0007 -MJSON -nE'say to_json(from_json($_, {allow_nonref=>1}), > {pretty=>1})' { "bar" :"ipsum", "foo" :"lorem" } |
注2:如果你跑
1 2 3 4 | 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编码
1 2 3 4 | { "D\u00fcsseldorf":"lorem", "bar":"ipsum" } |
如果管道的其余部分能够很好地处理Unicode,并且您希望JSON也对人友好,那么只需使用
1 2 3 4 | 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)' |
你会得到:
1 2 3 4 | { "Düsseldorf":"lorem", "bar":"ipsum" } |
我用JSHON来做你所描述的。只是运行:
1 | echo $COMPACTED_JSON_TEXT | jshon |
您还可以传递参数来转换JSON数据。
或者,与露比:
1 | echo '{"foo":"lorem","bar":"ipsum" }' | ruby -r json -e 'jj JSON.parse gets' |
Check out Jazor. It's a simple command line JSON parser written in Ruby.
1 2 | gem install jazor jazor --help |
Simply pipe the output to
Example:
1 | twurl -H ads-api.twitter.com '.......' | jq . |
JSONLint has an open-source implementation on GitHub that can be used on the command line or included in a Node.js project.
1 | npm install jsonlint -g |
然后
1 | jsonlint -p myfile.json |
或
1 | curl -s"http://api.twitter.com/1/users/show/user.json" | jsonlint | less |
Vanilla Bash
A simple Bash script (
json_pretty.sh
1 2 3 4 | #/bin/bash grep -Eo '"[^"]*" *(: *([0-9]*|"[^"]*")[^{}\["]*|,)?|[^"\]\[\}\{]*|\{|\},?|\[|\],?|[0-9 ]*,?' | awk '{if ($0 ~ /^[}\]]/ ) offset-=4; printf"%*c%s ", offset,"", $0; if ($0 ~ /^[{\[]/) offset+=4}' |
实例:1)在控制台中读取文件和漂亮的打印
1 | cat file.json | json_pretty.sh |
2)与Windows Git Bash一起使用,从文件到文件(基于UTF-8):
1 | cat fileIn.json |sh.exe json_pretty.sh > fileOut.json |
侏儒
我将python的json.tool与pygmentize结合在一起:
1 2 3 | echo '{"foo":"bar <div class="suo-content">[collapse title=""]<ul><li>有时需要使用<wyn>pygmentize -l json</wyn>进行染色。</li><li>用APT包<wyn>python-pygments</wyn>安装,即<wyn>apt-get install python-pygments</wyn></li></ul>[/collapse]</div><hr><P>使用Perl,如果您从CPAN安装json::pp,您将获得json_pp命令。从B Bycroft那里偷了一个例子:</P>[cc][pdurbin@beamish ~]$ echo '{"foo":"lorem","bar":"ipsum <hr><P>我建议使用json::xs perl模块中包含的json-xs命令行实用程序。JSON::XS是用于序列化/反序列化JSON的Perl模块,在Debian或Ubuntu计算机上,您可以这样安装它:</P>[cc]sudo apt-get install libjson-xs-perl |
它显然也可以在CPAN上使用。
要使用它来格式化从URL获得的JSON,您可以使用curl或wget,如下所示:
1 | $ curl -s http://page.that.serves.json.com/json/ | json_xs |
或者:
1 | $ wget -q -O - http://page.that.serves.json.com/json/ | json_xs |
要格式化文件中包含的JSON,可以执行以下操作:
1 | $ json_xs < file-full-of.json |
重新格式化为yaml,有些人认为它比json更具人类可读性:
1 | $ json_xs -t yaml < file-full-of.json |
jj is super-fast, can handle ginormous JSON documents economically, does not mess with valid JSON numbers, and is easy to use, e.g.
1 | jj -p # for reading from STDIN |
or
1 | jj -p -i input.json |
It is (2018) still quite new so maybe it won’t handle invalid JSON the way you expect, but it is easy to install on major platforms.
使用以下命令安装yajl工具:
然后,
以我的经验,江户十一〔十三〕是非常好的。我用它的
1 | autocmd FileType json setlocal equalprg=json_reformat |
You can use this simple command to achieve the result:
1 | echo"{ "foo": "lorem", "bar": "ipsum" }"|python -m json.tool |
如果php大于等于5.4,则为php版本。
1 2 | alias prettify_json=php -E '$o = json_decode($argn); print json_encode($o, JSON_PRETTY_PRINT);' echo '{"a":1,"b":2}' | prettify_json |
Example:
1 | echo '{"bignum":1e1000}' | bat -p -l json |
It has colouring and formatting for JSON and does not have the problems noted in this comment: How can I pretty-print JSON in a shell script?
Use Ruby in one line:
1 | echo '{"test":1,"test2":2}' | ruby -e"require 'json'; puts JSON.pretty_generate(JSON.parse(STDIN.read))" |
And you can set an alias for this:
1 | alias to_j="ruby -e "require 'json';puts JSON.pretty_generate(JSON.parse(STDIN.read))"" |
Then you can use it more conveniently
1 2 3 4 5 6 | echo '{"test":1,"test2":2}' | to_j { "test": 1, "test2": 2 } |
And if you want display JSON with color, your can install
1 | gem install awesome_print |
then
1 | alias to_j="ruby -e "require 'json';require 'awesome_print';ap JSON.parse(STDIN.read)"" |
Try it!
1 | echo '{"test":1,"test2":2,"arr":["aa","bb","cc"] }' | to_j |
我用的是httpie
1 | $ pip install httpie |
你可以这样使用它
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $ 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 } |
这里有一个比json的prettify命令更好的Ruby解决方案。宝石
J.F.Sebastian的解决方案在Ubuntu8.04中对我不起作用。下面是一个修改过的Perl版本,它与旧的1.x JSON库一起使用:
1 2 | perl -0007 -MJSON -ne 'print objToJson(jsonToObj($_, {allow_nonref=>1}), {pretty=>1})," ";' |
1 2 | $ sudo apt-get install edit-json $ prettify_json myfile.json |
工具
1 2 3 4 5 | $ ydump my_data.json { "foo":"lorem", "bar":"ipsum" } |
或者您可以在json中输入管道:
1 2 3 4 5 6 | $ echo '{"foo":"lorem","bar":"ipsum <hr><P>下面介绍如何使用groovy脚本。</P><P>创建一个groovy脚本,比如说"漂亮的打印"</P>[cc]#!/usr/bin/env groovy import groovy.json.JsonOutput System.in.withReader { println JsonOutput.prettyPrint(it.readLine()) } |
使脚本可执行:
1 | chmod +x pretty-print |
现在从命令行,
1 2 3 4 5 6 7 | echo '{"foo":"lorem","bar":"ipsum <div class="suo-content">[collapse title=""]<ul><li>尽管我非常喜欢groovy,但由于JVM的开销,它并不适合这样的小脚本。我的非正式测量显示<wyn>jq</wyn>大约快50倍。</li></ul>[/collapse]</div><hr> <p> For Node.js you can also use the"util" module. It uses syntax-highlighting, smart indentation, removes quotes from keys and just makes the output as pretty as it gets. </p> [cc]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}))}}))" |
有Tidyjson。
它是C,所以也许你可以让它用mono编译,然后在*nix上工作。但是没有保证,对不起。
使用javascript/node.js:看看VKbeautify.js插件,它为JSON和XML文本提供了漂亮的打印。
它是用普通的javascript编写的,小于1.5 kb(小型化),速度非常快。
I'm the author of json-liner. It's a command line tool to turn JSON into a grep friendly format. Give it a try.
1 2 3 4 5 6 7 | $ echo '{"a": 1,"b": 2}' | json-liner /%a 1 /%b 2 $ echo '["foo","bar","baz"]' | json-liner /@0 foo /@1 bar /@2 baz |
如果安装了node.js,可以使用一行代码单独创建一个。创建一个文件:
> vim pretty
1 2 3 | #!/usr/bin/env node console.log(JSON.stringify(JSON.parse(process.argv[2]), null, 2)); |
添加执行权限:
> chmod +x pretty
> ./pretty '{"foo":"lorem","bar":"ipsum
https://github.com/aidanmelen/json_pretty_print
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 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#
<p><center>[wp_ad_camp_5]</center></p><hr><P>下面是一个绝妙的一行程序:</P>[cc]echo'"foo":"lorem","bar":"ipsum<hr>
<p>
A one-line solution using Node.js will look like this:
</p>
[cc]$ node -e"console.log( JSON.stringify( JSON.parse(require('fs').readFileSync(0) ), 0, 1 ))"For example:
1 $ cat test.json | node -e"console.log( JSON.stringify( JSON.parse(require('fs').readFileSync(0) ), 0, 1 ))"
1
2
3 gem install jsonpretty
echo '{"foo":"lorem","bar":"ipsum
<hr><P>如果您不介意使用第三方工具,您可以简单地转到jsonprettyprint.org。这是针对无法在计算机上安装软件包的情况。</P>[cc]curl -XPOST https://jsonprettyprint.org/api -d '{"user" : 1}'您可以使用smk:
1
2
3
4
5
6
7
8
9
10 echo'"foo":"lorem","bar":"ipsum<hr><P>另外,一定要检查jsonfui:一个支持折叠的命令行json查看器。</P><hr>
<p>
You can use Xidel.
</p>
<blockquote>
<p>
Xidel is a command line tool to download and extract data from HTML/XML pages or JSON-APIs, using CSS, XPath 3.0, XQuery 3.0, JSONiq or pattern templates. It can also create new or transformed XML/HTML/JSON documents.
</p>
</blockquote><P>默认情况下,xidel pretty打印:</P>[cc]$xidel-s--e'$json'<<<'"foo":"lorem","bar":"ipsum<hr><P>这些方法都没有解析我的JSON文件。</P><P>我的问题类似于帖子google数据源json是否无效?.</P><P>对那篇文章的回答帮助我找到了解决办法。</P><P>它被认为是没有字符串键的无效JSON。</P>[cc]{id:'name',label:'Name',type:'string'}必须是:
1
2 {"id":"name","label":"Name","type":"string
<div class="suo-content">[collapse title=""]<ul><li>JSON不允许使用单引号作为分隔符,一个健全的JSON解析器应该拒绝这样的输入。</li><li>最后两个链接似乎已断开("deron.meranda.us的服务器响应时间太长")。</li></ul>[/collapse]</div><hr><P>我知道原来的文章要求有一个shell脚本,但是有这么多有用的和不相关的答案,可能对原作者没有帮助。增加无关性:)</P><P>顺便说一句,我无法使用任何命令行工具。</P><P>如果有人想要简单的JSON JavaScript代码,他们可以做到:</P>[cc]JSON.stringfy(JSON.parse(str), null, 4)http://www.geospaces.org/geoweb/wiki.jsp?page=json%20实用程序%20演示
这里的javascript代码不仅美化了JSON,而且还按其属性或属性和级别对其进行了排序。
如果输入是
1 {"c": 1,"a": {"b1": 2,"a1":1 },"b": 1},它可以打印(将所有对象组合在一起):
1
2
3
4
5
6
7
8 {
"b": 1,
"c": 1,
"a": {
"a1": 1,
"b1": 2
}
}或(按键排序):
1
2
3
4
5
6
7
8 {
"a": {
"a1": 1,
"b1": 2
},
"b": 1,
"c": 1
}如果您可以选择使用在线工具,那么也可以使用在线工具。
我发现http://jsonprettyprint.net是最简单和最简单的。