如何在 shell 脚本中漂亮地打印 JSON?

How can I pretty-print JSON in a shell script?

提问人: 提问时间:12/9/2008 最后编辑:17 revs, 13 users 24%AnC 更新时间:11/12/2023 访问量:1738964

问:

是否有 (Unix) shell 脚本以人类可读的形式格式化 JSON?

基本上,我希望它转换以下内容:

{ "foo": "lorem", "bar": "ipsum" }

...变成这样的东西:

{
    "foo": "lorem",
    "bar": "ipsum"
}
json unix 命令行 格式 pretty-print

评论

0赞 shluvme 10/15/2012
stackoverflow.com/a/12892039/998291
0赞 Nick Tomlin 11/21/2012
偶然发现了这一点,但后来发现了 Json Pretty 和我非常喜欢它。Typekit 在他们的 API 示例中使用它,因此它背后有一些 klout ^^
10赞 exhuma 11/9/2012
不久前我滚动了自己的代码: github.com/exhuma/braindump/tree/master/jsonformat 代码非常简单,使用 python 自己的库,但我也添加了 pygments 以获得语法突出显示。json
0赞 Javaaaa 11/10/2014
如果您不介意复制粘贴,还可以在线使用一些简单的工具,例如 jsonprettyprint.net 您可以在其中快速打印原始 JSON。
13赞 peak 9/12/2015
请注意:python -m json.tool 并不总是生成有效的 JSON。(提示:1e1000)

答:

8赞 2 revs, 2 users 78%Peter Mortensen #1

TidyJSON。

它是 C#,所以也许你可以让它用 Mono 编译,并在 *nix 上工作。对不起,不能保证。

67赞 5 revs, 3 users 43%jfs #2
$ 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"
}

更重要的是,你可以在shell中使用python脚本将其作为函数:

json_format(){
    python3 -c'import fileinput, json; \
        print(json.dumps(json.loads("".join(fileinput.input())), \
                sort_keys=True, indent=4, ensure_ascii=False))'
}

然后你可以使用cat json.txt | json_format

评论

0赞 Robert Gould 12/9/2008
实际上我做同样的事情,但 javascript 本身:)
2赞 Rörd 12/16/2011
在我拥有的JSON模块版本中,似乎不接受选项。但这有效:to_jsonperl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
2赞 Dan Loewenherz 3/17/2014
Python 示例可以简化。将 JSON 输出直接输送到 .python -m json.tool
0赞 jfs 3/17/2014
@Dan:是的。有几个答案显示了代码示例。1. 此版本允许您更改某些参数,例如, 2.在发布时(2008 年),仍然使用不支持 -mjson.tool 的 Python 2.4json.toolindent
1赞 Guram Savinov 3/30/2023
@dwlz带有 Unicode 字符的命令行版本(需要 python3.9+):python -m json.tool --no-ensure-ascii in.json out.json
95赞 2 revs, 2 users 95%AnC #3

感谢 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))

评论

3赞 icktoofay 5/31/2013
当值加载到字典中时,顺序会丢失:普通对象没有定义的顺序。尝试一下,你会发现它们无论如何都被交换了。要修复它,请导入并传递 .dictjson.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False)OrderedDictloadobject_pairs_hook=OrderedDict
0赞 Gabe Johnson 11/1/2014
您可以使用以下命令将脚本更改为从标准输入中读取:.这使您可以将内容通过管道传递到脚本中,如下所示:inputFile = sys.stdincurl http://somewhere.com/foo.json | pp_json.py
1赞 Hugo 9/22/2015
为了避免使用 @icktoofay 的注释进行排序,请像这样导入 OrderedDict:.from collections import OrderedDict
2赞 blindsnowmobile 6/14/2016
谢谢@icktoofay。这允许我创建以下 vim 函数: 请注意,分隔符必须设置为 (',', ': ') 以避免添加尾随空格: bugs.python.org/issue16333com! 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=(',', ': '))"
0赞 JL Peyret 1/26/2017
很棒的片段!我改用了,因为我想用它来比较 json 文件,它就像一个魅力。sort_keys = True
8赞 2 revs, 2 users 57%pimlottc #4

J.F. Sebastian 的解决方案在 Ubuntu 8.04 中对我不起作用。
下面是一个修改后的 Perl 版本,适用于较旧的 1.X JSON 库:

perl -0007 -MJSON -ne 'print objToJson(jsonToObj($_, {allow_nonref=>1}), {pretty=>1}), "\n";'
74赞 4 revs, 2 users 83%Daryl Spitzer #5

在 *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 的回答之后将我的命名为“prettyJSON”),然后你就可以开始了。chmod +x

评论

0赞 AnC 8/1/2009
事实上,使用 stdin/stdout 更加灵活和简单。感谢您指出这一点。
3赞 dvogel 8/5/2010
对于需要命名文件的程序,请使用 /dev/stdin,同上表示 out 和 err。
4赞 jfs 5/19/2011
仅供参考 fileinput.input() 如果命令行中没有给出文件,则从 stdin 读取。
0赞 Zachary Vance 4/19/2013
fileinput.input() 不能很好地处理最后没有换行符的文件,上次我检查过。
0赞 Bui Anh Tuan 8/22/2017
他用shell脚本问,而不是python其他语言。有了JQ,可以完美地做到这一点。
44赞 darscan #6

或者,使用 Ruby:

echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'

评论

0赞 mjs 1/6/2010
这给了我一个错误。您需要安装一些 ruby json 包吗?
3赞 darscan 1/9/2010
是的,您需要 JSON Ruby Gem:sudo gem install json
0赞 Phrogz 6/27/2011
@MatSchaffer 请注意,如果您使用 JSON 通过自定义方法序列化对象,则这不起作用; 只有漂亮打印相同(或数字/字符串/布尔值)的数组和哈希值。to_jsonKernel#jj
0赞 Ross Attrill 2/15/2016
在 Windows 上,请尝试以下操作:echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
5119赞 14 revs, 13 users 41%Cristian Ciupitu #7

在 Python 2.6+ 或 3 中,您可以使用 json.tool 模块:

echo '{"foo": "lorem", "bar": "ipsum"}' | python -m json.tool

或者,如果 JSON 位于文件中,您可以执行以下操作:

python -m json.tool my_json.json

如果 JSON 来自 Internet 源(如 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
}

对于上述所有情况。你可以把它放进去,它每次都会在 shell 中可用。像 ..bashrcprettyjson_s '{"foo": "lorem", "bar": "ipsum"}'

请注意,正如@pnd在下面的评论中指出的那样,在 Python 3.5+ 中,JSON 对象不再默认排序。要进行排序,请在末尾添加 --sort-keys 标志。即.... | python -m json.tool --sort-keys

另一个有用的选项可能是 --no-ensure-ascii,它禁用非 ASCII 字符的转义(3.9 版中的新功能)。

评论

79赞 sharat87 12/3/2011
您可以通过管道将其传递到命令行中获取语法颜色的输出。编辑:如果您安装了pygments。pygmentize -l javascript
193赞 Chris Nash 6/27/2012
一个很好的答案,我唯一需要注意的是它确实对输出上的键进行排序 - 您可能需要注意这一点。
16赞 imwilsonxu 10/15/2012
在myy .vimrc中,“nnoremap <f5> :%!python -m json.tool<CR>:w<CR>”
50赞 user1071136 10/16/2012
这似乎将 Unicode 字符转义为 \uXXXX,这可能是一个缺点。
16赞 Clint Eastwood 2/26/2015
我创建了一个别名:,这样我就可以运行:。希望这会有所帮助。PS:如果有人设法将其扩展到 a) 删除我每次看到的 curl-output 和/或 b) 不对 json 键进行排序;请让我知道,我将不胜感激。alias pretty='python -mjson.tool | pygmentize -l jsoncommand params | pretty
68赞 2 revs, 2 users 55%Paul Horsfall #8

JSON Ruby Gem 与一个 shell 脚本捆绑在一起,用于美化 JSON:

sudo gem install json
echo '{ "foo": "bar" }' | prettify_json.rb

脚本下载:gist.github.com/3738968

评论

7赞 a3nm 5/30/2011
请注意,此解决方案解码 unicode“\uxxxx”转义序列,这与带有 .但是,它似乎也有嵌套深度限制()。json.toolnesting of 20 is too deep (JSON::NestingError)
2赞 Janus Troelsen 3/28/2012
在 Ubuntu 上,您可以执行以下操作: 而不是sudo apt-get install ruby-json-puregem install
1赞 Eric Hartford 6/1/2012
'''eric-mbp:~ ericstob$ sudo gem install json 密码: Fetching: json-1.7.3.gem (100%) 构建本机扩展。这可能需要一段时间......已成功安装 json-1.7.3 已安装 1 个 gem 安装 json-1.7.3 的 ri 文档...正在安装 json-1.7.3 的 RDoc 文档...eric-mbp:~ ericstob$ prettify_json.rb -bash:prettify_json.rb:找不到命令
0赞 Andrew 8/24/2012
也许你可以发布你的内容?prettify_json.rb
0赞 Uri 10/2/2012
您可以下载脚本,将其移动到您的文件夹(确保它在 PATH 中),重命名并运行 .现在你可以做类似的事情~/binprettify_json.rbppjchmod +x ppjcurl www.jsonsring.com/something.json | ppj
77赞 4 revs, 2 users 76%knb #9

使用Perl,使用CPAN模块。它安装一个命令行工具。JSON::XSjson_xs

驗證:

json_xs -t null < myfile.json

将 JSON 文件美化为:src.jsonpretty.json

< src.json json_xs > pretty.json

如果没有,请尝试 。“pp”代表“纯Perl”——该工具仅在Perl中实现,没有绑定到外部C库(这是XS的缩写,Perl的“扩展系统”)。json_xsjson_pp

评论

9赞 Janus Troelsen 5/15/2012
似乎是Cygwin的标准配置!
15赞 MichielB 12/6/2013
json_pp 可以以相同的方式使用,并且很可能很容易安装在您的系统上(在 Debian 上,它位于 'perl' 软件包中)。
8赞 Gregg Williams 5/13/2014
仅供参考,在我的 Mac OS X 10.9 系统上,json_pp会自动可用。
0赞 Lucas 3/5/2017
-t null给了我 null:不是有效的 toformat...但是把它关掉,效果很好。谢谢。
0赞 Kjetil S. 3/21/2017
pp 是纯 perl,这里不是漂亮的打印:)由于 json_xs 和 json_pp 不仅可以做漂亮的打印,还可以用 -json_opt 做其他事情而不是漂亮的打印。虽然漂亮的打印是默认行为。
411赞 9 revs, 7 users 32%Krinkle #10

我使用 JSON.stringify 的“space”参数在 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));\
 });\
"

评论

10赞 Gurpartap Singh 8/12/2011
要调试 Node.js 中的对象,您应该真正使用 sys.inspect() 而不是 JSON.stringify()。原因如下:markhansen.co.nz/inspecting-with-json-stringify
12赞 danorton 9/2/2012
投了反对票。OP 是关于“*nix 命令行脚本”的,这个答案是不同的上下文。
54赞 calvinf 9/18/2012
@danorton:JS 可以通过 node.js 和其他类似的解决方案从命令行使用。
11赞 Julian D. 11/6/2014
无需控制台:还将结果输出到 STDOUT。node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"
3赞 Lukasz Wiktor 2/17/2016
文件名与 stdin 的脚本不同,这很糟糕
39赞 Mike Conigliaro #11

看看 Jazor。这是一个用 Ruby 编写的简单命令行 JSON 解析器。

gem install jazor
jazor --help

评论

5赞 Leo Cassarani 11/23/2011
是我一个人,还是这是唯一能真正回答OP问题的建议?我来这里寻找一个简单的命令,我可以将输出管道到其中,这是唯一一个为我完成的命令。curl
2赞 Andrew 8/24/2012
我喜欢它可以选择为输出着色。使其更易于阅读。
0赞 Andrew 8/24/2012
哦,我也喜欢传递 url 的选项,因为我使用它来查看我的 REST API 的输出
104赞 3 revs, 3 users 43%gregers #12

如果使用 npm 和 Node.js,则可以执行命令,然后通过管道传递命令。做以获得所有选项。它还可以提取特定字段并使用 着色输出。npm install -g jsonjsonjson -h-i

curl -s http://search.twitter.com/search.json?q=node.js | json
20赞 3 revs, 3 users 77%htaccess #13

我建议使用 json_xs 命令行实用程序,它包含在 JSON::XS perl 模块中。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
5赞 Bryan Larsen #14
$ sudo apt-get install edit-json
$ prettify_json myfile.json
10赞 3 revs, 3 users 80%Hank Gay #15

根据我的经验,yajl 非常好。我使用它的命令将以下行放在我的 :json_reformat.jsonvim.vimrc

autocmd FileType json setlocal equalprg=json_reformat
41赞 2 revs, 2 users 57%yardena #16

我使用 jshon 来完全按照您的描述进行操作。只需运行:

echo $COMPACTED_JSON_TEXT | jshon

还可以传递参数来转换 JSON 数据。

评论

0赞 Alexander 6/14/2012
谢谢,jshon 比使用 python 或 ruby 完成相同的任务要快得多
2赞 joensson 6/20/2012
@Alexander - 您需要多快的漂亮打印机?我使用的是预装了 Python 的 OSx Lion。使用 python -mjson.tool,我可以在 0.1 秒内打印出一个 96KB 的 json 文件 - jshon 链接到的 earthporn 的 json 输出约为 24KB,我可以在 0.08 秒内打印出来。jshon 对你来说快多少?
2赞 Ryan Ballantyne 4/23/2013
我正在使用 1+GB 压缩(谁甚至知道未压缩有多大)JSON 数据文件,所以我非常感谢 jshon 更快的建议。
25赞 3 revs, 2 users 80%Philip Durbin #17

使用 Perl,如果从 CPAN 安装 JSON::P P,您将获得 json_pp 命令。从 B Bycroft 那里窃取示例,你会得到:

[pdurbin@beamish ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

值得一提的是,它预装了 Ubuntu 12.04(至少)和 Debianjson_pp/usr/bin/json_pp

185赞 5 revs, 5 users 35%locojay #18

我通常只做:

echo '{"test":1,"test2":2}' | python -mjson.tool

要检索选择数据(在本例中为“test”的值):

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

评论

0赞 Florian 11/7/2013
如果 JSON 应该直接来自 HTTP API,这也是一个用 Python 实现的不错工具: github.com/jkbr/httpie
0赞 Iolo 2/16/2015
如果你已经安装了节点(并且不介意 YAML 样式的输出),还有这个包: rafeca.com/prettyjson 这样你就可以用| prettyjson
3赞 peak 9/4/2015
如上所述,python -mjson.tool 作为 JSON 漂亮打印机的问题之一是它并不总是发出 JSON。例如,1e1000 变为 Infinity(无论使用 python 2.x 还是 3.x)。'jq .' 总是生成 JSON,但它不能保证完全保留非常大(或非常小的值)。
4赞 2 revs, 2 users 84%numan salati #19

以下是如何使用 Groovy 脚本执行此操作。

创建一个 Groovy 脚本,比如说“pretty-print”

#!/usr/bin/env groovy

import groovy.json.JsonOutput

System.in.withReader { println JsonOutput.prettyPrint(it.readLine()) }

使脚本可执行:

chmod +x pretty-print

现在从命令行,

echo '{"foo": "lorem", "bar": "ipsum"}' | ./pretty-print

评论

1赞 MarkHu 1/19/2018
尽管我很喜欢Groovy,但由于JVM的开销,它不太适合这样的小脚本。我的非正式测量显示速度快了大约 50 倍。jq
3赞 Wu Yongzheng #20

我是json-liner的作者。它是一个命令行工具,用于将 JSON 转换为对 grep 友好的格式。试一试。

$ echo '{"a": 1, "b": 2}' | json-liner
/%a 1
/%b 2
$ echo '["foo", "bar", "baz"]' | json-liner
/@0 foo
/@1 bar
/@2 baz
3赞 3 revs, 3 users 55%vadimk #21

使用 JavaScript/Node.js:看看 vkBeautify.js 插件,它为 JSON 和 XML 文本提供了漂亮的打印。

它是用纯 JavaScript 编写的,小于 1.5 KB(缩小),速度非常快。

1赞 5 revs, 5 users 72%nelaaro #22

我的 JSON 文件没有被这些方法中的任何一个解析。

我的问题类似于帖子 谷歌数据源JSON无效吗?.

那篇文章的答案帮助我找到了解决方案。

它被认为是没有字符串键的无效 JSON。

{id:'name',label:'Name',type:'string'}

必须是:

{"id": "name", "label": "Name", "type": "string"}

此链接对一些不同的 JSON 解析器进行了很好的全面比较: http://deron.meranda.us/python/comparing_json_modules/basic

这让我想到了 http://deron.meranda.us/python/demjson/。我认为这个解析器比许多其他解析器更能容错。

评论

4赞 Salman A 4/27/2012
JSON 不允许使用单引号作为分隔符,理智的 JSON 解析器应该拒绝此类输入。
0赞 Peter Mortensen 4/9/2019
最后两个链接似乎已断开(“deron.meranda.us 的服务器响应时间过长”)。
31赞 5 revs, 4 users 61%Salman A #23

JSONLint 在 GitHub 上有一个开源实现,可以在命令行上使用或包含在 Node.js 项目中。

npm install jsonlint -g

然后

jsonlint -p myfile.json

curl -s "http://api.twitter.com/1/users/show/user.json" | jsonlint | less

评论

0赞 Adrien Joly 6/18/2020
我建议不要全局安装 nodejs/npm 依赖项 =>我会改用:(即没有必要)npxcurl -s "http://api.twitter.com/1/users/show/user.json" | npx jsonlint | lessnpm install
357赞 6 revs, 4 users 85%Dave Dopson #24

我写了一个工具,它有最好的“智能空白”格式化程序之一。与此处的大多数其他选项相比,它产生的可读性更高,输出更冗长。

下划线-cli

这就是“智能空白”的样子:

我可能有点偏见,但它是一个很棒的工具,用于从命令行打印和操作 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

这个工具是我目前热衷的项目,所以如果你有任何功能要求,我很有可能会解决它们。

评论

4赞 Gal Bracha 11/21/2013
我还更新了我的 ~/.bash_profile 以包含以下行: alias underscor='underscore print --outfmt pretty' 现在我可以做 curl example.com/result.json |underscor 并且仍然使用下划线进行其他格式
0赞 Maxim Ponomarev 1/20/2015
谢谢戴夫!工具很好!alias pretty-json=“underrsore pretty” 和 curl 输出令人赏心悦目
0赞 tiurin 1/24/2015
很棒的格式化工具,只需注意一点:将输出转发到文件(使用 -o 选项或 > )仅适用于下划线打印下划线 pretty 保存了一个插入了颜色格式符号的文件,例如:、,以及每个符号之前的一些不可打印的符号,这使得 JSON 无效。但是,仅使用下划线打印不会向文件添加任何内容,并且可以完美地完成其格式设置工作。[32m[33m[39m
0赞 Bluu 2/27/2015
我喜欢,但这对于我没有双引号键的“JSON”非常有效。jq
0赞 mycargus 5/14/2015
@DaveDopson感谢您的出色工具!将尝试与 jsonselect.org/#tryit 一起使用...
-3赞 3 revs, 3 users 70%Roberto #25

我知道原来的帖子要求一个 shell 脚本,但有太多有用和不相关的答案可能对原作者没有帮助。 增加无关紧要:)

顺便说一句,我无法让任何命令行工具工作。

如果有人想要简单的 JSON JavaScript 代码,他们可以这样做:

JSON.stringfy(JSON.parse(str), null, 4)

http://www.geospaces.org/geoweb/Wiki.jsp?page=JSON%20Utilities%20Demos

下面是 JavaScript 代码,它不仅美化了 JSON,而且按其属性或属性和级别对它们进行了排序。

如果输入是

{ "c": 1, "a": {"b1": 2, "a1":1 }, "b": 1},

它要么打印(将所有对象组合在一起):

{
     "b": 1,
     "c": 1,
     "a": {
          "a1": 1,
          "b1": 2
     }
}

或者(仅按键排序):

{
 "a": {
      "a1": 1,
      "b1": 2
 },
 "b": 1,
 "c": 1
}
17赞 3 revs, 3 users 57%Uma sankar pradhan #26

使用以下命令安装 yajl-tools:

sudo apt-get install yajl-tools

然后

echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat

评论

0赞 Joseph Lust 6/21/2014
棒。不需要其他语言/解释器,并且在软件包存储库中,无需酿造!
54赞 3 revs, 2 users 91%Johann Philipp Strathausen #27

试试 pjson。它有颜色!

echo '{"json":"obj"} | pjson

安装它:pip

⚡ pip install pjson

然后将任何 JSON 内容通过管道传递给 .pjson

评论

0赞 Kristjan Adojaan 11/22/2013
它需要python-pip(sudo apt-get install python-pip),然后(sudo pip install pjson)最大的优势是颜色!
1赞 Kristjan Adojaan 11/22/2013
缺点是无法对彩色输出进行 grep。
1514赞 11 revs, 9 users 36%Vita Pluvia #28

您可以使用: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"
}

或与身份筛选器一起使用:jq

$ jq '.foo' <<< '{ "foo": "lorem", "bar": "ipsum" }'
"lorem"

评论

18赞 Matthew Flaschen 11/4/2014
还有一个选项,在某些情况下很有帮助。--sort-keys
23赞 Hover Ruan 4/21/2015
使用 curl:curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
33赞 peak 9/4/2015
“jq.”作为漂亮的打印机是很好的,但它有一个警告:jq(包括jq 1.5版本)将改变非常大和非常小的数字的值,因为它将数值解析为IEEE 754 64位值。要检查您最喜欢的漂亮打印机是否存在相同的问题,请尝试以下值:1e1000。请注意,python -mjson.tool 严重失败了这个测试,因为它产生了 Infinity,它甚至不是 JSON。
28赞 jchook 12/29/2016
@Meekohi替代方案是“不必要地使用回声”。非常高兴能找到操作员——这正是我想要的。<<<
5赞 phil294 1/14/2018
jq是最好的,因为它是彩色打印的!
9赞 2 revs, 2 users 86%svidgen #29

PHP 版本(如果有 PHP >= 5.4)。

alias prettify_json=php -E '$o = json_decode($argn); print json_encode($o, JSON_PRETTY_PRINT);'
echo '{"a":1,"b":2}' | prettify_json

评论

3赞 Fabien Sa 3/5/2016
一行:echo '{"a":1,"b":2}' | php -r 'echo json_encode(json_decode(fgets(STDIN)), JSON_PRETTY_PRINT)."\n";'
1赞 Zack Morris 2/23/2017
多线功能:printf '{\n"a":1,\n"b":2\n}' | php -r 'echo json_encode(json_decode(file_get_contents("php://stdin")), JSON_PRETTY_PRINT) . PHP_EOL;'
60赞 6 revs, 5 users 67%jordelver #30

更新我现在正在按照另一个答案中的建议使用。它在过滤 JSON 方面非常强大,但从根本上讲,它也是一种漂亮的打印 JSON 以供查看的绝佳方式。jq

jsonpp 是一个非常好的命令行 JSON 漂亮的打印机。

从自述文件:

漂亮的打印 Web 服务响应如下:

curl -s -L http://<!---->t.co/tYTq5Pu | jsonpp

并使磁盘上运行的文件变得漂亮:

jsonpp data/long_malformed.json

如果您使用的是 Mac OS X,则可以 .如果没有,您可以简单地将二进制文件复制到 .brew install jsonpp$PATH

评论

1赞 volker 4/29/2015
我尝试了jsonpp(过去成功使用)对付一个大文件(>60MB)。我在 5 分钟后停止了它。我把它输送到(从这里的其他答案),花了 10-20 秒......python -mjson.tool
0赞 jordelver 4/29/2015
60MB 的 JSON?哇!我通常不会处理那么大但有用的文件。谢谢。
0赞 davidpricedev 7/29/2016
在我的 ubuntu 盒子上,我有一个 - 它确实很好地格式化了 json,尽管命名相似,但我相信这是一个与这里提到的完全不同的项目json_ppjsonpp
10赞 3 revs, 3 users 78%Pablo Fernandez heelhook #31

这是一个比 Json 的 prettify 命令更好的 Ruby 解决方案。宝石相当不错。colorful_json

gem install colorful_json
echo '{"foo": "lorem", "bar": "ipsum"}' | cjson
{
  "foo": "lorem",
  "bar": "ipsum"
}
3赞 2 revs, 2 users 67%Orest Ivasiv #32

这是 Groovy 的一句话:

echo '{"foo": "lorem", "bar": "ipsum"}' | groovy -e 'import groovy.json.*; println JsonOutput.prettyPrint(System.in.text)'
-2赞 2 revs, 2 users 80%Javaaaa #33

如果这是您的选择,您也可以改用在线工具。

我发现 http://jsonprettyprint.net 是最简单和最容易的。

8赞 slashmili #34

我正在使用 httpie

$ pip install httpie

你可以像这样使用它

 $ 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
 }
25赞 4 revs, 2 users 86%Shubham Chaudhary #35

Pygmentize

我将 Python 的 json.tool 与 pygmentize 相结合:

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

我的这个答案中列出了一些 pygmentize 的替代方案。

这是一个现场演示:

Demo

评论

5赞 jpsecher 11/23/2015
有时需要使用才能着色。pygmentize -l json
0赞 jan 1/5/2018
使用 apt 包安装,即python-pygmentsapt-get install python-pygments
7赞 2 revs, 2 users 57%adius #36

对于 Node.js,您还可以使用“util”模块。它使用语法突出显示、智能缩进、从键中删除引号,并使输出尽可能漂亮。

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}))}}))"
3赞 2 revslev #37
gem install jsonpretty
echo '{"foo": "lorem", "bar": "ipsum"}' | jsonpretty

此方法还检测 HTTP 响应/标头,原封不动地打印它们,然后跳到 正文(用于“curl -i”)”。

85赞 7 revs, 3 users 50%Evgeny Karpov #38

一个简单的 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

评论

1赞 Evgeny Karpov 7/28/2016
感谢您的反馈。我今天刚刚写了这个脚本供个人使用,它在我的情况下运行良好。我进行了修复,现在它更小了,没有这个问题。没有支持完全格式的目标,但如有必要,我可以进行其他修复。
7赞 Zaboj Campula 10/6/2016
这是我找到的唯一有效的答案。我有一个嵌入式 linux - 没有 rubby,没有 javascript,无法访问互联网来下载 python 模块......我的 awk 略有不同,不支持符号,所以我将 更改为 .我的 awk 有不同的正则表达式转义,反斜杠在 中不起作用。我将正则表达式更改为 和 .%*cprintfc=0; while (c++<offset) printf " "; printf $0;[]/^[[{]//[]}]/
6赞 Blag 2/20/2018
这应该是可以接受的,因为它是完全原生的,不需要第三方软件......
1赞 Blag 2/21/2018
@EvgenyKarpov不错的捕获,不需要完全回滚,只是被错误地删除了;)grep
2赞 Rotsor 6/23/2019
这个脚本非常脆弱,它不支持完整的 json 语法。例如,它变成(在多行上)。{ "\"" : "quote" }{ "\" " : " }
6赞 2 revs, 2 users 55%josch #39

该工具是一个 JSON pretty-printer:ydump

$ ydump my_data.json
{
  "foo": "lorem",
  "bar": "ipsum"
}

或者,您可以通过管道传入 JSON:

$ echo '{"foo": "lorem", "bar": "ipsum"}' | ydump
{
  "foo": "lorem",
  "bar": "ipsum"
}

这可能是除了使用该工具之外最短的解决方案。jq

此工具是 OCaml 库的一部分,在此处进行记录。yojson

在 Debian 及其衍生产品上,软件包包含此工具。或者,可以通过OPAM安装。libyojson-ocaml-devyojson

30赞 2 revs, 2 users 71%Benjamin W. #40

只需将输出通过管道传递给 。jq .

例:

twurl -H ads-api.twitter.com '.......' | jq .

评论

0赞 Pramit 10/8/2016
Singh @Ackshaey很好的答案,也可以轻松地将其重定向到文件。例如cat <file_name.txt> | jq . > <output_name.txt>
9赞 Distwo 10/15/2016
brew install jq如果您使用的是 Mac OS。
1赞 peak 10/21/2016
不幸的是,用于漂亮的打印有一个潜在的缺点:所有现存的 jq 版本都坚持将 JSON 数字视为 IEEE 数字,因此精度很容易丢失,例如对于非常大的整数。jq .
2赞 Mark Reed 1/31/2017
@Pramit总是浪费一个过程;只是做(使用文字和字符)。cat file |jq . <file_name.txt >output_name.txt<>
2赞 2 revs, 2 users 83%Yada #41

如果您不介意使用第三方工具,您可以简单地卷曲jsonprettyprint.org。这适用于无法在计算机上安装软件包的情况。

curl -XPOST https://jsonprettyprint.org/api -d '{"user" : 1}'

评论

0赞 Niel de Wet 5/29/2017
若要将 stdin 通过管道传递给此命令,请执行如下操作:echo '{ "foo": "lorem", "bar": "ipsum" }' | curl -XPOST https://jsonprettyprint.org/api -d @-
1赞 chronos #42

另外,请务必查看 JSONFUI:支持折叠的命令行 JSON 查看器

5赞 2 revs, 2 users 89%Nikhil Ranjan #43

如果您安装了 Node.js,则可以使用一行代码自行创建一个。创建一个漂亮的文件:

> vim 漂亮

#!/usr/bin/env node

console.log(JSON.stringify(JSON.parse(process.argv[2]), null, 2));

添加执行权限:

> chmod +x 漂亮

> ./pretty '{“foo”: “lorem”, “bar”: “ipsum”}'

或者,如果您的 JSON 位于文件中:

#!/usr/bin/env node

console.log(JSON.stringify(require("./" + process.argv[2]), null, 2));

> ./漂亮的file.json

评论

1赞 Nikhil Ranjan 5/31/2017
process.stdin.resume();变量输入 = '';process.stdin.on('data', (data) => { input += data; });process.stdin.on('end', () => { console.log(JSON.stringify(JSON.parse(input), null, 2));
75赞 2 revs, 2 users 73%JedatKinports #44

我就是这样做的:

curl yourUri | json_pp

它缩短了代码并完成了工作。

评论

4赞 jonathanjo 6/21/2019
Ubuntu 服务器:如果您的生产计算机的安装非常受限,这可能是最佳选择,因为它默认以特定名称安装。Python 通常以不同的方式安装(例如 python3、python 或根本不安装),具体取决于版本。
1赞 Fabian Rios 6/9/2022
适用于 Mac :)
3赞 Mitrakov Artem 9/21/2022
默认情况下,适用于 MacOS 和 Linux (Debian)。我会推荐这个答案
3赞 2 revs, 2 users 82%Aidan Melen #45

https://github.com/aidanmelen/json_pretty_print

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#"}
    try:
        jsonschema.validate(data, schema,
                            format_checker=jsonschema.FormatChecker())
    except jsonschema.exceptions.ValidationError as ve:
        sys.stderr.write("Whoops, the data you provided does not seem to be " \
        "valid JSON.\n{}".format(ve))

def pprint(data, python_obj=False, **kwargs):
    _validate(data)
    kwargs["indent"] = kwargs.get("indent", 4)
    pretty_data = json.dumps(data, **kwargs)
    if python_obj:
        print(pretty_data)
    else:
       repls = (("u'",'"'),
                ("'",'"'),
                ("None",'null'),
                ("True",'true'),
                ("False",'false'))
    print(reduce(lambda a, kv: a.replace(*kv), repls, pretty_data))
98赞 5 revs, 4 users 50%Peter Mortensen #46

使用 jq 工具的原生方式并不太简单。

例如:

cat xxx | jq .

评论

7赞 peak 10/20/2017
警告:jq 将数字编码为 IEEE 754 64 位浮点数,因此它们的表示形式可能会发生变化。非常小和非常大的数字的精度可能会丢失。要检查您最喜欢的漂亮打印机是否存在相同的问题,请尝试以下值:1e1000。
5赞 michael 12/1/2017
或者简单地说: ;但也(没有过滤器)也有效。(在 Ubuntu/Linux 上;跨平台的 YMMV)jq . file.jsoncat file.json | jq.
0赞 PhilT 9/4/2023
已经安装在 Ubuntu 和颜色中。好
16赞 alexanderjsingleton #47
  1. brew install jq
  2. command + | jq
  3. (示例:curl localhost:5000/blocks | jq)
  4. 享受!

enter image description here

13赞 4 revs, 2 users 83%fangxing #48

在一行中使用 Ruby:

echo '{"test":1,"test2":2}' | ruby -e "require 'json'; puts JSON.pretty_generate(JSON.parse(STDIN.read))"

您可以为此设置别名:

alias to_j="ruby -e \"require 'json';puts JSON.pretty_generate(JSON.parse(STDIN.read))\""

然后你可以更方便地使用它

echo '{"test":1,"test2":2}' | to_j

{
  "test": 1,
  "test2": 2
}

如果你想显示带有颜色的JSON,你可以安装,awesome_print

gem install awesome_print

然后

alias to_j="ruby -e \"require 'json';require 'awesome_print';ap JSON.parse(STDIN.read)\""

试试吧!

echo '{"test":1,"test2":2, "arr":["aa","bb","cc"] }' | to_j

Enter image description here

20赞 3 revs, 2 users 96%peak #49

jj 速度超快,可以经济地处理巨大的 JSON 文档,不会弄乱有效的 JSON 数字,并且易于使用,例如

jj -p # for reading from STDIN

jj -p -i input.json

它(2018 年)仍然很新,所以也许它不会像您期望的那样处理无效的 JSON,但它很容易安装在主要平台上。

42赞 2 revs, 2 users 57%Arpit Rathod #50

您可以使用以下简单命令来实现结果:

echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool

评论

0赞 Eugene C 10/8/2019
在我看来最好的答案。体积小,易于记忆,不需要安装任何非标准工具。
0赞 pushNpop 10/10/2019
python -m json.tool 似乎没有保留 JSON 对象的顺序。
0赞 HardQuestions 9/23/2020
它在 python 2 中进行排序,在 python 3 中不对 github.com/python/cpython/blob/3.8/Lib/json/tool.py 进行排序
17赞 3 revs, 2 users 73%Grav #51

bat 是一个带有语法突出显示的克隆:cat

例:

echo '{"bignum":1e1000}' | bat -p -l json

-p将输出不带标头,并将显式指定语言。-l

它具有 JSON 的颜色和格式,并且没有以下评论中提到的问题:如何在 shell 脚本中漂亮地打印 JSON?

13赞 3 revs, 3 users 71%harish2704 #52

使用 Node.js 的单行解决方案如下所示:

$ node -e "console.log( JSON.stringify( JSON.parse(require('fs').readFileSync(0) ), 0, 1 ))"

例如:

$ cat test.json | node -e "console.log( JSON.stringify( JSON.parse(require('fs').readFileSync(0) ), 0, 1 ))"

评论

0赞 Matthis Kohli 3/9/2020
即使我很久以前就投票支持这个,但这个例子对我来说没有输出。有些事情发生了变化......
1赞 harish2704 3/10/2020
@MatthisKohli:我刚刚在 Node V12.x 上重新检查了它,它正在工作。这段代码没有什么神奇之处。 读取当前进程并格式化 JSON。因此,中断 API 更改的可能性非常小fs.readFileSync(0)stdinJSON.stringify
1赞 2 revsReino #53

您可以使用

Xidel 是一个命令行工具,用于使用 CSS、XPath 3.0、XQuery 3.0、JSONiq 或模式模板从 HTML/XML 页面或 JSON-API 下载和提取数据。它还可以创建新的或转换的 XML/HTML/JSON 文档。

默认情况下,Xidel pretty-prints:

$ xidel -se '$json' <<< '{"foo":"lorem","bar":"ipsum"}'
{
  "foo": "lorem",
  "bar": "ipsum"
}

艺术

$ echo '{"foo":"lorem","bar":"ipsum"}' | xidel -se '$json'
{
  "foo": "lorem",
  "bar": "ipsum"
}
29赞 Schmitzi #54

您可以简单地使用 jq 或 json_pp 等标准工具。

echo '{ "foo": "lorem", "bar": "ipsum" }' | json_pp

echo '{ "foo": "lorem", "bar": "ipsum" }' | jq

将像下面这样美化输出(jq 甚至更丰富多彩):

{
  "foo": "lorem",
  "bar": "ipsum"
}

jq 的巨大优势在于,如果您想解析和处理 json,它可以做更多的事情。

评论

0赞 David H 4/29/2020
json_pp在我的 Mac 上 - 但不是 jq。谢谢!
1赞 Schmitzi 4/29/2020
@DavidH - 这有帮助吗:stackoverflow.com/questions/37668134/......
9赞 4 revsUlysse BN #55

TL;DR:对于性能,请使用 .jj -p < my.json

基准

我在这里采用了一些解决方案,并使用下一个虚拟脚本对它们进行了基准测试:

function bench {
    time (
      for i in {1..1000}; do
        echo '{ "foo" : { "bar": { "dolorem" : "ipsum", "quia" : { "dolor" : "sit"} } } }' \
        | $@ > /dev/null
      done
    )
}

这是我的 mac(32 GB、Apple M1 Max、YMMV)上的结果:

bench python -m json.tool
# 8.39s user 12.31s system 42% cpu 48.536 total
bench jq
# 13.12s user 1.28s system 87% cpu 16.535 total
bench bat -p -l json # NOTE: only syntax colorisation.
# 1.87s user 1.47s system 66% cpu 5.024 total
bench jj -p
# 1.94s user 2.44s system 57% cpu 7.591 total
bench xidel -s - -e '$json' --printed-json-format=pretty                      
# 4.32s user 1.89s system 76% cpu 8.101 total

感谢@peak和您对 jj 这一发现的回答

评论

1赞 Ulysse BN 2/19/2022
@HiltonFernandes随意编辑:)
1赞 Ulysse BN 3/4/2022
@HiltonFernandes我了!但可以肯定的是,我可以安装东西并运行基准测试。不过我现在使用的是 M1 芯片,所以 YMMV...顺便说一句,在 Mac 上安装和运行基准测试的步骤:(1.) , (2.) 复制并粘贴功能块, (3.) 复制并粘贴 Bench 块, (4.) 使用您的配置编辑这篇文章(关于我的 Mac)。另外,请不要沾沾自喜,我明白要点了......brew install jq bat tidwall/jj/jj xidel
1赞 Ulysse BN 3/4/2022
@HiltonFernandes你去吧
1赞 Ulysse BN 3/4/2022
@Reino我终于安装了 xidel 0.9.9,它有很多依赖项并且没有有效地打包(TL;DR:并感觉到svn的痛苦)。但是我不得不承认,它很快(,击败 jj)。我仍然不建议它:安装过程很繁重,而且构建尚未正式发布......免責聲明:从现在开始,我将停止编辑这篇文章。我在评论中添加了足够的信息供其他人使用,所以请这样做!我这样做的报酬并不比你高。brew install xidel --head5s
1赞 Hilton Fernandes 3/4/2022
很棒的@UlysseBN!我想知道,在你原来的形式下,启动大量轻线的成本可能会比漂亮的印刷本身更强大。现在,每次运行都会执行更多的工作,线程启动成本可能会成比例地降低。
4赞 calbertts #56

我想出了这个解决方案:https://calbertts.medium.com/unix-pipelines-with-curl-requests-and-serverless-functions-e21117ae4c65

# this in your bash profile
jsonprettify() {
  curl -Ss -X POST -H "Content-Type: text/plain" --data-binary @- https://jsonprettify.vercel.app/api/server?indent=$@
}
echo '{"prop": true, "key": [1,2]}' | jsonprettify 4
# {
#     "prop": true,
#     "key": [
#         1,
#         2
#     ]
# }

无需安装任何东西,如果您安装了互联网连接和 cURL,则可以使用此功能。

您是否在另一台无法安装任何东西的主机中,这将是该问题的完美解决方案。

17赞 Rafiek #57

当您在系统上安装节点时,以下工作将起作用。

echo '{"test":1,"test2":2}' | npx json

{
  "test": 1,
  "test2": 2
}
44赞 2 revs, 2 users 84%Techie #58

您只需要使用jq

如果没有安装 jq,那么你需要先安装 jq:

sudo apt-get update
sudo apt-get install jq

安装 jq 后,只需要使用:jq

echo '{ "foo": "lorem", "bar": "ipsum" }' | jq

输出如下所示

{
  "foo": "lorem",
  "bar": "ipsum"
}

评论

8赞 Moebius 11/22/2021
或者,如果您使用的是 Mac。brew install jq
0赞 Gagan #59

如果你想在控制台可视化json日志,你可以使用munia-pretty-json

npm install -g munia-pretty-json

您的 json 数据 (app-log.json)

{"time":"2021-06-09T02:50:22Z","level":"info","message":"Log for pretty JSON","module":"init","hostip":"192.168.0.138","pid":123}
{"time":"2021-06-09T03:27:43Z","level":"warn","message":"Here is warning message","module":"send-message","hostip":"192.168.0.138","pid":123}

运行以下命令:

munia-pretty-json app-log.json

以下是控制台上的可读输出:

enter image description here

您可以使用模板设置输出格式。默认模板是'{time} {level -c} {message}'

使用模板:

munia-pretty-json -t '{module -c} - {level} - {message}' app-log.json

输出:

enter image description here

0赞 Adam Erickson #60

同意 .您可以将以下函数添加到:jq$HOME/.bashrc

jqless () {
  args=$1
  shift
  jq --color-output . $args "$@" | less --raw-control-chars
}

这允许任意数量的输入 JSON 文件。

5赞 Caleb Koch #61

您可以使用 Prettier 来执行此操作。

npx prettier <JSON file>应该在给定文件中打印 JSON 的美化版本,同时使用美化的 JSON 覆盖给定的 JSON 文件。npx prettier --write <JSON file>

评论

0赞 Kira 3/10/2023
这非常简单易用
1赞 jpseng #62

yq 可以用来漂亮地打印 JSON

echo '{"foo": "lorem", "bar": "ipsum"}' | yq -o json

它有一个定义缩进的选项

echo '{"foo": "lorem", "bar": "ipsum"}' | yq -o json --indent 3

您可以在彩色和单色输出之间进行选择

echo '{"foo": "lorem", "bar": "ipsum"}' | yq -o json --colors
echo '{"foo": "lorem", "bar": "ipsum"}' | yq -o json --no-colors