是否有(Unix)shell脚本以人类可读的形式格式化JSON?
基本上,我希望它改变以下内容:
{ "foo": "lorem", "bar": "ipsum" }
...进入这样的事情:
{
"foo": "lorem",
"bar": "ipsum"
}
是否有(Unix)shell脚本以人类可读的形式格式化JSON?
基本上,我希望它改变以下内容:
{ "foo": "lorem", "bar": "ipsum" }
...进入这样的事情:
{
"foo": "lorem",
"bar": "ipsum"
}
使用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"}'
。
您可以使用: jq
它使用起来非常简单,效果很好!它可以处理非常大的JSON结构,包括流。你可以找到 他们的教程 这里。
这是一个例子:
$ jq . <<< '{ "foo": "lorem", "bar": "ipsum" }'
{
"bar": "ipsum",
"foo": "lorem"
}
或者换句话说:
$ echo '{ "foo": "lorem", "bar": "ipsum" }' | jq .
{
"bar": "ipsum",
"foo": "lorem"
}
我使用的是“空间”参数 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');
从带有nodejs的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));\
});\
"
我写了一个工具,它有一个最好的“智能空白”格式化器。它比这里的大多数其他选项产生更可读,更简洁的输出。
这就是“智能空白”的样子:
我可能有点偏颇,但它是一个很棒的工具,用于从命令行打印和操作JSON数据。它使用起来非常友好,并提供广泛的命令行帮助/文档。这是一把瑞士军刀,我用它来完成1001个不同的小任务,任何其他方式都令人惊讶地烦人。
最新用例:Chrome,开发控制台,网络选项卡,全部导出为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
这个工具是我目前的激情项目,所以如果您有任何功能请求,我很有可能会解决它们。
我通常只做:
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
感谢J.F. 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))
在* 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)
把它放在一个文件中(之后我命名为“prettyJSON”) ANC回答你的路径和路径 chmod +x
它,你很高兴。
使用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的“扩展系统”)。
如果你使用npm和Node.js,你可以这样做 npm install -g json
然后通过管道传递命令 json
。做 json -h
获得所有选项。它还可以拉出特定字段并使输出着色 -i
。
curl -s http://search.twitter.com/search.json?q=node.js | json