如何在命令行中漂亮地打印JSON文件?

89

我有一个包含一系列JSON元素的文件:

{ element0: "lorem", value0: "ipsum" }
{ element1: "lorem", value0: "ipsum" }
...
{ elementN: "lorem", value0: "ipsum" }

有没有一段shell脚本可以格式化JSON以便以易读的形式显示文件内容?

我看过这篇帖子,我认为它是一个很好的起点!

我的想法是遍历文件中的行,然后:

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

还有其他人有什么想法吗?


7
可能是如何漂亮地打印JSON?的重复内容。 - Hubert Kario
7
假设你已经安装了jq,你可以通过运行命令cat somefile.json | jq .将文件内容格式化输出。 - nonbeing
1
重要的是要注意,OP“说”的是“JSON”,但实际上指的是没有顶级对象之间逗号的Newline-Delimited JSON(NDJSON)。(这在基于JSON的日志框架中很常见。) - Coderer
13个回答

151
将文件的结果导入 Python 2.6 及以上版本的 json 工具。
python -m json.tool < 'file_name'

你知道如何处理一个目录中的所有文件吗?我还不熟悉 Bash 脚本。 - keiki
7
alias ppjson="python -m json.tool"添加到你的~/.profile文件中,以避免下次需要此命令时再返回这里。 - jcollum
这对我不起作用!!我得到了“期望属性名称:第1列第3行(字符2)”。Python 2.7.16在Linux上运行,内核为4.4.0,在安装了“python”和“python-cjson”软件包的Debian buster上。 - BrendanSimon

79

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

当我花了比应该更长的时间去发现它时,我觉得它值得有自己的介绍。我在查找一种简单的方法来美化docker inspect -f的json输出。Noufal Ibrahim在另一个答案中简要提到它。

根据 jq 网站(https://stedolan.github.io/jq/):

jq 就像是 JSON 数据的 sed - 您可以使用它来切片、过滤、映射和转换结构化数据,就像 sed、awk、grep 和 friends 让您处理文本一样方便。

它默认提供彩色输出,只需将其管道传输到 jq 即可,例如:

jq . < file

例子:

"原始"的JSON输出通过jq管道处理后的相同输出


5
勘误:需要使用管道符号将内容传递给 jq '.',因为 jq 需要这个最小指令。 - Titou
jq有选项可以更改缩进--indent 2和对对象中的键进行排序--sort-keys(这在将JSON检入存储库时非常有用,因为差异会更加明显)。 - Eponymous

55
您可以使用Python JSON工具(需要Python 2.6+)。
例如:
echo '{ "element0" : "lorem", "element1" : "ipsum" }' | python -m json.tool

这将给你:

{
    "element0": "lorem",
    "element1": "ipsum"
}

16

我可以从Mac OS 10.15终端使用 json_pp 命令:

echo '{ "element0" : "lorem", "element1" : "ipsum" }' | json_pp

非常棒的答案,希望我能够点赞更多!对我们来说完美解决了问题。 - dev2505

13

使用Pygmentize + Python json.tool实现彩色输出

Pygmentize是一个强大的工具。参考此链接。我将Python json.tool与pygmentize结合使用。

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

如需了解其他类似工具和安装说明,请查看上面链接的答案。

这里有一个实时演示:

demo


3
好的!我不知道pygmentize!但是我必须先安装它,然后运行命令".... | pygmentize -l python",你的命令"... | pygmentize -g"对我没有用(可以漂亮地打印JSON,但没有颜色)。 - Luca Davanzo

6

有很多这样的命令。我个人在.zshrc文件中使用这个别名。

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

这里的pjson.py是指

#!/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 \n %s \n Error : %s"%(input_str, str(e))

这让我可以在命令行中使用它作为一个管道(类似于curl http://.... | pjson)。

然而,自定义代码是一种负担,因此有jq,在我看来它是黄金标准。它用C编写(因此可移植,不需要像Python或Node那样的依赖项),不仅可以进行漂亮的打印,还可以快速地处理更多操作。


很好,这个解决方案不错! - Luca Davanzo
3
这个Python脚本不错,但为什么要首先将其包装在一个shell函数中呢? - Jo So
2
所以解决方案是添加一个 bash 脚本,它将运行一个 Python 脚本,该脚本仅在您的本地机器上工作? - Nimrod007
Jo So: 我这样做是为了让 pager 与 -X 兼容。拥有一个 pager 是很有用的,但默认情况下,less 会清屏和执行不想要的操作。 - Noufal Ibrahim
Nimrod007:不是很重要。这只是我快速而粗略的脚本储藏中的一部分。对我来说很有效,所以我没有费心去改变它。我也喜欢它有一个翻页功能的事实。 - Noufal Ibrahim
4
答案中真正有价值的是jq。我认为它比这个问题中的所有解决方案都优秀。 - Noufal Ibrahim

6
在Mac操作系统中,使用以下命令安装jq
$ brew install jq

您可以获得与以下类似的漂亮打印JSON:
$ 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
}

5
您可以使用在所有 Linux 系统上都可安装的 jq 包。请使用以下命令安装该工具。
# Redhat based systems(Centos)
yum install -y epel-release
yum install -y jq

# Debian based systems
apt install -y jq

然后您就可以将文本流导入到jq工具中。
echo '{"test":"value", "test2":"value2"}' | jq

希望这个答案能够帮到您。


1
你需要在CentOS 7上安装epel-release - fa wildchild

2

Shawn的解决方案,但适用于Python 3:

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

1

如何通过命令行将json格式化为表格

你可以使用jtab这个用rust编写的工具,将任何json数据打印成表格。

例如:

➜ echo '{"foo": "bar"}' | jtab

+-----+
| foo |
+-----+
| bar |
+-----+

它也可以处理 JSON 数组:

➜  echo '[{"id": "1", "name": "Rust"}, {"id": "2", "name": "Jtab"}]' | jtab

+----+------+
| id | name |
+----+------+
| 1  | Rust |
+----+------+
| 2  | Jtab |
+----+------+

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接