关于shell:如何从命令行漂亮地打印JSON文件?

How can I pretty-print a JSON file from the command line?

我有一个包含json元素序列的文件:

1
2
3
4
{ element0:"lorem", value0:"ipsum" }
{ element1:"lorem", value0:"ipsum" }
...
{ elementN:"lorem", value0:"ipsum" }

是否有一个shell脚本来格式化json以以可读的形式显示文件内容?

我看过这篇文章,我认为这是一个很好的起点!

我的想法是迭代文件中的行,然后:

1
while read row; do echo ${row} | python -mjson.tool; done <"file_name"

有人有其他想法吗?


将文件中的结果通过管道传输到python json工具2.6中。

1
cat 'file_name' | python -m json.tool


您可以使用python json工具(需要python 2.6+)。

例如:

1
echo '{"element0" :"lorem","element1" :"ipsum" }' | python -m json.tool

这将给你:

1
2
3
4
{
   "element0":"lorem",
   "element1":"ipsum"
}


JQ-一个轻量级和灵活的命令行JSON处理器

当我花了比必须发现的时间更长的时间时,我觉得这是值得一试的。我在寻找一种简单的方法来漂亮地打印docker inspect -f的JSON输出。这是努法尔·易卜拉欣在上面简短提到的另一个答案的一部分。

来自JQ网站(https://stedolan.github.io/jq/):

jq is like sed for JSON data - you can use it to slice and filter and map and transform structured data with the same ease that sed, awk, grep and friends let you play with text.

它默认提供彩色输出,您只需通过管道连接到jq,例如

1
cat file | jq .

例子:

"原始"JSON输出与连接到JQ的相同输出


使用pygmentize+python json.tool的彩色输出

Pygmentize是一个杀手工具。看到这个了。我将python json.tool与pygmentize结合在一起

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

有关其他类似工具和安装说明,请参阅上面链接的答案。

以下是现场演示:

demo


有很多。我个人在我的.zshrc中有这个别名。

1
2
3
pjson () {
        ~/bin/pjson.py | less -X
}

其中pjson.py

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python

import json
import sys

try:
    input_str = sys.stdin.read()
    print json.dumps(json.loads(input_str), sort_keys = True, indent = 2)
except ValueError,e:
    print"Couldn't decode
 %s
 Error : %s"%(input_str, str(e))

允许我在命令行中将其用作管道(类似于curl http://.... | pjson)。

哦,自定义代码是一种责任,所以有JQ,在我看来,它像黄金标准。它是用C语言编写的(因此是可移植的,没有依赖性,如python或node),它不仅可以很好地打印,而且速度很快。


您可以使用jq包,该包可以安装在所有Linux系统中。使用以下命令安装工具。

1
2
3
4
5
6
# Redhat based systems(Centos)
yum install -y epel-release
yum install -y jq

# Debian based systems
apt install -y jq

然后,您将能够将文本流传输到JQ工具。

1
echo '{"test":"value","test2":"value2"}' | jq

希望这个答案会有所帮助。


在Mac OS中,用命令安装jq

1
$ brew install jq

你可以得到与

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ curl -X GET http://localhost:8080/api/v1/appointments/1  | jq


  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   117    0   117    0     0   8404      0 --:--:-- --:--:-- --:--:--  9000
{
 "craeted_at":"10:24:38",
 "appointment_date":"2019-02-08",
 "name_of_doctor":"Monika",
 "status": true,
 "price": 12.5,
 "id": 1
}

Shawn的解决方案,但对于python 3:

1
echo '{"foo":"bar"}' | python3 -m json.tool