如何在shell脚本中打印JSON?

2905 unix format command-line json pretty-print

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

基本上,我希望它改变以下内容:

{ "foo": "lorem", "bar": "ipsum" }
Run Code Online (Sandbox Code Playgroud)

...进入这样的事情:

{
    "foo": "lorem",
    "bar": "ipsum"
}
Run Code Online (Sandbox Code Playgroud)

小智 4285

使用Python 2.6+,你可以做到:

echo '{"foo": "lorem", "bar": "ipsum"}' | python -m json.tool
Run Code Online (Sandbox Code Playgroud)

或者,如果JSON在文件中,您可以:

python -m json.tool my_json.json
Run Code Online (Sandbox Code Playgroud)

如果JSON来自互联网资源,如API,您可以使用

curl http://my_url/ | python -m json.tool
Run Code Online (Sandbox Code Playgroud)

为了方便所有这些情况,您可以创建一个别名:

alias prettyjson='python -m json.tool'
Run Code Online (Sandbox Code Playgroud)

为了更方便,可以通过更多的打字来准备它:

prettyjson_s() {
    echo "$1" | python -m json.tool
}

prettyjson_f() {
    python -m json.tool "$1"
}

prettyjson_w() {
    curl "$1" | python -m json.tool
}
Run Code Online (Sandbox Code Playgroud)

对于以上所有情况.您可以将其放入,.bashrc并且每次都可以在shell中使用.像调用它一样prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'.

  • 一个很好的答案,我唯一要注意的是它*确实*对输出的键进行排序 - 您可能需要注意这些. (171认同)
  • 您可以将其传递到`pygmentize -l javascript`以在命令行中获得语法颜色输出.**编辑**:如果你安装了pygments. (64认同)
  • 这似乎将Unicode字符转换为\ uXXXX,这可能是一个缺点. (38认同)
  • 在myy .vimrc"nnoremap <f5>:%!python -m json.tool <CR>:w <CR>" (13认同)
  • 我创建了一个别名:`alias pretty ='python -mjson.tool | pygmentize -l json`这样我就可以运行:`command params | pretty`.希望这可以帮助.PS:是否有人设法将此扩展到a)删除我每次都看到的卷曲输出和/或b)不对json键进行排序; 请让我知道,我将非常感谢. (13认同)
  • 在Python 3.5中更改:输出现在与输入相同的顺序.使用`--sort-keys`按字母顺序对键进行排序.回应@ChrisNash的评论. (9认同)
  • alias ppj ='python -mjson.tool'; echo'{"foo":"lorem","bar":"ipsum"}'| PPJ (4认同)
  • @ user1071136要在输出中保留Unicode字符,必须创建自己的脚本.import sys import json j = json.load(sys.stdin)json.dump(j,sys.stdout,ensure_ascii = False,sort_keys = True,indent = 4,separators =(',',':')) (4认同)
  • 使用其他版本的Python,您可以安装simplejson并使用python -msimplejson.tool (3认同)
  • *python -m json.tool*作为JSON漂亮打印机的另一个问题是它并不总是打印有效的JSON值.例如,1e1000被转换为无限. (3认同)
  • 并通过将输出管道输入'colout -t json'来添加语法高亮显示.首先需要'pip install colout'. (2认同)
  • 它不接受顶级数组,因此遗憾的是并非所有 json 。 (2认同)
  • 如果您使用的是macOS,并且剪贴板上有一些要格式化`pbpaste |的json,python -m json.tool | pbcopy`。 (2认同)
  • @ClintEastwood-curl -s选项将禁止输出,例如`curl -s http:// my_url / |。python -m json.tool`应该只打印JSON。 (2认同)

Vit*_*via 902

您可以使用: 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"
}
Run Code Online (Sandbox Code Playgroud)

或者换句话说:

$ 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"
}
Run Code Online (Sandbox Code Playgroud)

  • 由于模糊[<<<运算符](http://linux.die.net/abs-guide/x15683.html),这个答案令人困惑.为什么不使用`echo'{"foo":"lorem","bar":"ipsum"}'| jq .`为例子? (27认同)
  • @Meekohi的另一种选择是"不必要地使用回声".非常高兴找到了`<<<`操作符 - 正是我所寻找的. (17认同)
  • "jq." 作为一个漂亮的打印机是很棒的,但它有一个警告:jq(直到并包括jq版本1.5)将改变非常大和非常小的数字的值,因为它将数值解析为IEEE 754 64位值.要检查您最喜欢的漂亮打印机是否存在相同问题,请尝试以下值:1e1000.请注意,*python -mjson.tool*严重失败,因为它产生Infinity,甚至不是JSON. (16认同)
  • 还有一个`--sort-keys`选项,在某些情况下很有用. (10认同)
  • 使用curl:`curl'https://api.github.com/repos/stedolan/jq/commits?per_page = 5'| jq'.'` (7认同)
  • `jq` 是最好的,因为它以彩色打印! (4认同)
  • 到底为什么这个超过1000个赞的答案隐藏在第2页?`jq` 是迄今为止最好的工具之一。Stack Overflow 需要改进其答案排序算法。 (2认同)

Som*_*omu 374

我使用"space"参数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');
Run Code Online (Sandbox Code Playgroud)

从带有nodejs的Unix命令行,在命令行上指定json:

$ node -e "console.log(JSON.stringify(JSON.parse(process.argv[1]), null, '\t'));" \
  '{"foo":"lorem","bar":"ipsum"}'
Run Code Online (Sandbox Code Playgroud)

返回:

{
    "foo": "lorem",
    "bar": "ipsum"
}
Run Code Online (Sandbox Code Playgroud)

从带有Node.js的Unix命令行,指定包含JSON的文件名,并使用四个空格的缩进:

$ node -e "console.log(JSON.stringify(JSON.parse(require('fs') \
      .readFileSync(process.argv[1])), null, 4));"  filename.json
Run Code Online (Sandbox Code Playgroud)

使用管道:

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));\
 });\
"
Run Code Online (Sandbox Code Playgroud)

  • @danorton:可以通过node.js和其他类似解决方案从命令行使用JS. (47认同)
  • Downvoted.OP是关于"*nix命令行脚本"的,这个答案是不同的上下文. (11认同)
  • 对于Node.js中的调试对象,您应该使用sys.inspect()而不是JSON.stringify().原因如下:http://markhansen.co.nz/inspecting-with-json-stringify/ (9认同)
  • 不需要控制台:`node -p"JSON.stringify(JSON.parse(process.argv [1]),null,'\ t');"`也将结果输出到STDOUT. (9认同)
  • 对于文件名与stdin的脚本不同,这很糟糕 (2认同)
  • 为什么不使用 require('util').inspect(JSON.parse(obj))` ?它提供漂亮的打印、颜色和[一堆其他功能](https://dev.to/siddharthshyniben/the-node-js-util-module-3nbd#:~:text=now%2C%20you%20may% 20think%20it%20is%20just%20an%20equivalent%20of%20console.log(json.stringify(obj))%2C%20but%20there%20is%20a%20lot%20more%20功能%20可用%20使用%20the%20选项% 20对象.%20一些%20的%20的%20更多%20有用的%20选项%20是%3A) (2认同)

Dav*_*son 335

我写了一个工具,它有一个最好的"智能空白"格式化器.它比这里的大多数其他选项产生更可读,更简洁的输出.

强调-CLI

这就是"智能空白"的样子:

我可能有点偏颇,但它是一个很棒的工具,用于从命令行打印和操作JSON数据.它使用起来非常友好,并提供广泛的命令行帮助/文档.这是一把瑞士军刀,我用它来完成1001个不同的小任务,以任何其他方式令人惊讶地烦人.

最新用例:Chrome,开发控制台,网络选项卡,全部导出为HAR文件,"cat site.har |下划线选择'.url' - outfmt text | grep mydomain"; 现在我有一个按时间顺序列出的所有URL提取列表,在加载我公司的网站时.

漂亮的打印很简单:

underscore -i data.json print
Run Code Online (Sandbox Code Playgroud)

一样:

cat data.json | underscore print
Run Code Online (Sandbox Code Playgroud)

同样的事情,更明确:

cat data.json | underscore print --outfmt pretty
Run Code Online (Sandbox Code Playgroud)

这个工具是我目前的激情项目,所以如果您有任何功能请求,我很有可能会解决它们.

  • 我还更新了〜/ .bash_profile以获得以下行:alias underscor ='underscore print --outfmt pretty'现在我可以做curl http://example.com/result.json | undercor并仍然使用下划线进行其他格式化 (4认同)

loc*_*jay 173

我通常只做:

echo '{"test":1,"test2":2}' | python -mjson.tool
Run Code Online (Sandbox Code Playgroud)

并检索选择数据(在这种情况下,"测试"的值):

echo '{"test":1,"test2":2}' | python -c 'import sys,json;data=json.loads(sys.stdin.read()); print data["test"]'
Run Code Online (Sandbox Code Playgroud)

如果JSON数据在文件中:

python -mjson.tool filename.json
Run Code Online (Sandbox Code Playgroud)

如果要curl使用身份验证令牌在命令行中一次性完成所有操作:

curl -X GET -H "Authorization: Token wef4fwef54te4t5teerdfgghrtgdg53" http://testsite/api/ | python -mjson.tool
Run Code Online (Sandbox Code Playgroud)

  • 如上所述,*python -mjson.tool*作为JSON漂亮打印机的问题之一是它并不总是发出JSON.例如1e1000变为Infinity(无论是使用python 2.x还是3.x).'jq.' 总是生成JSON,但它不能保证精确保留非常大(或非常小的值). (3认同)
  • python> = 2.6必需 (2认同)

小智 87

感谢JF 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))
Run Code Online (Sandbox Code Playgroud)

  • 当值加载到字典中时,顺序丢失:正常的`dict`对象没有定义的顺序.试试`json.dumps(json.loads('{"b":1,"a":2}'),sort_keys = False)`你会发现它们仍然被交换了.要修复它,导入`OrderedDict`和`load`传递`object_pairs_hook = OrderedDict`. (3认同)
  • 谢谢@icktoofay。这使我可以创建以下vim函数:`com!格式为JSON%! ,spacers =(',',':'))“`注意,分隔符必须设置为(',',':'),以避免添加尾随空白:https://bugs.python.org/issue16333 (2认同)

isa*_*acs 77

如果使用npm和Node.js,则可以执行npm install -g json,然后通过管道传递命令json.不要json -h把所有的选项.它还可以拉出特定字段并使输出着色-i.

curl -s http://search.twitter.com/search.json?q=node.js | json
Run Code Online (Sandbox Code Playgroud)


Ole*_*zak 76

使用jq工具使用机方式并不太简单.

例如:

cat xxx | jq .
Run Code Online (Sandbox Code Playgroud)

  • 警告:jq将数字编码为IEEE 754 64位浮点数,因此它们的表示可能会发生变化.非常小和非常大的数字的精度可能会丢失.要检查您最喜欢的漂亮打印机是否存在相同问题,请尝试以下值:1e1000. (6认同)
  • 或简单地:`jq。file.json`; 还有`cat file.json | jq`(不使用过滤器“。”)也可以使用。(在ubuntu / linux上;跨平台ymmv) (4认同)

knb*_*knb 71

使用Perl,使用CPAN模块JSON::XS.它安装了一个命令行工具json_xs.

验证:

json_xs -t null < myfile.json
Run Code Online (Sandbox Code Playgroud)

将JSON文件整形src.jsonpretty.json:

< src.json json_xs > pretty.json
Run Code Online (Sandbox Code Playgroud)

如果你没有json_xs,试试吧json_pp."pp"用于"纯perl" - 该工具仅在Perl中实现,没有绑定到外部C库(这是XS代表的,Perl的"扩展系统").

  • json_pp可以以相同的方式使用,并且很可能很容易安装在您的系统上(在Debian上它位于'perl'包中). (12认同)
  • 似乎是Cygwin的标准配置! (9认同)
  • 仅供参考,在我的Mac OS X 10.9系统上,json_pp可自动使用. (7认同)

Dar*_*zer 69

在*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)
Run Code Online (Sandbox Code Playgroud)

把它放在一个文件中(我在AnC的回答中将其命名为"prettyJSON" )在你的PATH和chmod +x它中,你很高兴.

  • FYI [`fileinput.input()`](http://docs.python.org/library/fileinput.html#fileinput.input)从stdin如果没有在命令行给定的文件中读取.[实施例](http://stackoverflow.com/questions/352098/how-to-pretty-print-json-script/352160#352160) (4认同)
  • 对于期望命名文件的程序,使用/ dev/stdin,ditto for out和err. (3认同)

小智 65

JSON Ruby Gem与shell脚本捆绑在一起以美化JSON:

sudo gem install json
echo '{ "foo": "bar" }' | prettify_json.rb
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,此解决方案解码unicode"\ uxxxx"转义序列,与使用`json.tool`的Python解码不同.但是,它似乎也有嵌套深度限制("嵌套20太深(JSON :: NestingError)"). (6认同)
  • 在Ubuntu你可以做:``sudo apt-get install ruby​​-json-pure``而不是``gem install`` (2认同)

jor*_*ver 57

更新我现在正在使用jq另一个答案的建议.它在过滤JSON方面非常强大,但从最基本的角度来看,它也是一种非常棒的方式来打印JSON以供查看.

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

来自README:

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

curl -s -L http://<!---->t.co/tYTq5Pu | jsonpp
Run Code Online (Sandbox Code Playgroud)

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

jsonpp data/long_malformed.json
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Mac OS X,则可以brew install jsonpp.如果没有,您只需将二进制文件复制到您的某个位置即可$PATH.


Tad*_*dej 54

这就是我这样做的方式:

curl yourUri | json_pp
Run Code Online (Sandbox Code Playgroud)

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

  • 默认情况下适用于 MacOS 和 Linux (Debian)。我推荐这个答案 (3认同)
  • 遵循管道字符时尝试过的最佳解决方案。 (2认同)
  • Ubuntu服务器:如果您的生产计算机的安装受到严格限制,这可能是最佳选择,因为默认情况下它是使用特定名称安装的。根据版本,Python通常以不同的方式安装(例如python3,python或根本不安装)。 (2认同)

Joh*_*sen 52

试试pjson.它有颜色!

echo'{

安装它pip:

? pip install pjson

然后将任何JSON内容传递给pjson.


Evg*_*pov 50

香草巴什

一个简单的Bash脚本(__CODE__/ __CODE__),用于漂亮的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}'
Run Code Online (Sandbox Code Playgroud)

例子:

1)在控制台中读取文件和漂亮的打印

cat file.json | json_pretty.sh
Run Code Online (Sandbox Code Playgroud)

2)使用Windows GIT Bash从文件到文件(基于UTF8):

#/bin/bash

grep -Eo '"[^"]*" *(: *([0-9]*|"[^"]*")[^{}\["]*|,)?|[^"\]\[\}\{]*|\{|\},?|\[|\],?|[0-9 ]*,?' | awk '{if ($0 ~ /^[}\]]/ ) offset-=4; printf "%*c%s\n", offset, " ", $0; if ($0 ~ /^[{\[]/) offset+=4}'
Run Code Online (Sandbox Code Playgroud)

  • 那只是我发现的有效答案。我有一个嵌入式Linux-没有rubby,没有javascript,无法访问互联网来下载python模块...我有略有不同的awk,不支持`%* c`表示法,因此我将`printf`更改为`c = 0 ; while(c ++ &lt;offset)printf“”; printf $ 0;` 我的awk具有不同的正则表达式转义,而反斜杠在`[]中不起作用。我将正则表达式更改为`/ ^ [[{{/]和`/ []}] /`。 (2认同)
  • 这应该被接受,因为它是完全本机的,不需要第三方软件... (2认同)
  • 这个脚本非常脆弱,并且不支持完整的 json 语法。例如,它将 `{ "\"" : "quote" }` 转换为 `{ "\" " : " }` (在多行上)。 (2认同)

小智 46

你只需要使用jq

如果没有安装jq则需要先安装jq:

sudo apt-get update
sudo apt-get install jq
Run Code Online (Sandbox Code Playgroud)

安装jq后只需要使用jq

echo '{ "foo": "lorem", "bar": "ipsum" }' | jq
Run Code Online (Sandbox Code Playgroud)

输出看起来像

{
  "foo": "lorem",
  "bar": "ipsum"
}
Run Code Online (Sandbox Code Playgroud)

  • 或者如果您使用的是 Mac,请执行“brew install jq”。 (8认同)

jfs*_*jfs 45

$ 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"
}
Run Code Online (Sandbox Code Playgroud)

注:这是不是做它的方式.

在Perl中也是如此:

$ cat json.txt \
> | perl -0007 -MJSON -nE'say to_json(from_json($_, {allow_nonref=>1}), 
>                                     {pretty=>1})'
{
   "bar" : "ipsum",
   "foo" : "lorem"
}
Run Code Online (Sandbox Code Playgroud)

注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))'
Run Code Online (Sandbox Code Playgroud)

好的可读单词变成\ u编码

{
    "D\u00fcsseldorf": "lorem", 
    "bar": "ipsum"
}
Run Code Online (Sandbox Code Playgroud)

如果您的管道的其余部分将优雅地处理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)'
Run Code Online (Sandbox Code Playgroud)

你会得到:

{
    "Düsseldorf": "lorem", 
    "bar": "ipsum"
}
Run Code Online (Sandbox Code Playgroud)

  • 在我所拥有的JSON模块版本中,`to_json`似乎不接受选项.但这有效:`perl -MJSON -nE'说JSON-> new-> pretty-> encode(from_json $ _)'text.json` (2认同)
  • Python 示例可以简化。将 JSON 输出直接通过管道传输到“python -m json.tool”要容易得多。 (2认同)

yar*_*ena 40

我使用jshon来完成您所描述的内容.赶紧跑:

echo $COMPACTED_JSON_TEXT | jshon
Run Code Online (Sandbox Code Playgroud)

您还可以传递参数以转换JSON数据.

  • @Alexander - 你需要多快的漂亮打印机?我在预装Python的OSx Lion上.使用python -mjson.tool我可以在0.1秒内打印出一个96KB的json文件 - jshon链接到的earthporn的json输出大约是24KB,我可以在0.08s内打印出来.jshon对你来说快多快? (2认同)
  • 我正在使用 1+GB 压缩的(谁甚至知道未压缩的)JSON 数据文件,所以我非常感谢 jshon 更快的建议。 (2认同)

dar*_*can 38

或者,使用Ruby:

echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'
Run Code Online (Sandbox Code Playgroud)

  • 如果你碰巧在红宝石中,只需使用`jj my_object` (5认同)
  • 是的,你需要JSON Ruby Gem:sudo gem install json (3认同)

Mik*_*ike 36

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

gem install jazor
jazor --help
Run Code Online (Sandbox Code Playgroud)

  • 这只是我还是这是唯一能够回答OP问题的建议?我来到这里寻找一个简单的命令,我可以管理`curl`的输出,这是唯一一个为我做的. (4认同)
  • 我喜欢它可以选择着色输出.使阅读更容易. (2认同)

Sal*_*n A 31

JSONLint 在github上有一个开源实现,可以在命令行上使用,也可以包含在node.js项目中.

npm install jsonlint -g
Run Code Online (Sandbox Code Playgroud)

然后

jsonlint -p myfile.json
Run Code Online (Sandbox Code Playgroud)

要么

curl -s "http://api.twitter.com/1/users/show/user.json" | jsonlint | less
Run Code Online (Sandbox Code Playgroud)


小智 31

echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool
Run Code Online (Sandbox Code Playgroud)

你可以使用这个简单的命令来实现结果.


小智 29

只需将输出管道输送到jq ..

例:

twurl -H ads-api.twitter.com '.......' | jq .
Run Code Online (Sandbox Code Playgroud)

  • 如果你在mac os上,请"brew install jq". (9认同)
  • @Pramit`cat file |`总是浪费一个过程; 只是做`jq.<file_name.txt> output_name.txt`(带有文字`<`和`>`字符). (2认同)

Shu*_*ary 24

Pygmentize

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

echo '{"foo": "bar"}' | python -m json.tool | pygmentize -g
Run Code Online (Sandbox Code Playgroud)

pygmentize有一些替代品,这个答案中列出了.

这是一个现场演示:

演示

  • 有时需要使用`pygmentize -l json`来获得颜色. (5认同)

Phi*_*bin 21

使用Perl,如果从CPAN 安装JSON :: PP,您将获得json_pp命令.偷例如乙Bycroft你:

[pdurbin@beamish ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
   "bar" : "ipsum",
   "foo" : "lorem"
}
Run Code Online (Sandbox Code Playgroud)

值得一提的json_pp是预先安装了Ubuntu 12.04(至少)和Debian/usr/bin/json_pp


hta*_*ess 19

我建议使用JSON :: XS perl模块中包含的json_xs命令行实用程序.JSON :: XS是一个用于序列化/反序列化JSON的Perl模块,在Debian或Ubuntu机器上你可以像这样安装它:

sudo apt-get install libjson-xs-perl
Run Code Online (Sandbox Code Playgroud)

它显然也可以在CPAN上使用.

要使用它来格式化从URL获取的JSON,您可以使用curl或wget,如下所示:

$ curl -s http://page.that.serves.json.com/json/ | json_xs
Run Code Online (Sandbox Code Playgroud)

或这个:

$ wget -q -O - http://page.that.serves.json.com/json/ | json_xs
Run Code Online (Sandbox Code Playgroud)

并格式化文件中包含的JSON,您可以这样做:

$ json_xs < file-full-of.json
Run Code Online (Sandbox Code Playgroud)

要重新格式化为YAML,有些人认为它比JSON更具人性化可读性:

$ json_xs -t yaml < file-full-of.json
Run Code Online (Sandbox Code Playgroud)


ale*_*ton 16

  1. brew install jq
  2. command + | jq
  3. (例如:curl localhost:5000/blocks | jq)
  4. 请享用!

在此输入图像描述


pea*_*eak 16

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

jj -p # for reading from STDIN
Run Code Online (Sandbox Code Playgroud)

要么

jj -p -i input.json
Run Code Online (Sandbox Code Playgroud)

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


Gra*_*rav 15

bat是一个cat语法高亮的克隆:https: //github.com/sharkdp/bat

例:

echo '{"bignum":1e1000}' | bat -p -l json
Run Code Online (Sandbox Code Playgroud)

-p将输出没有标题,-l并将明确指定语言.

它着色和格式化的JSON,一点没有在此评论指出的问题:在一个shell脚本,我怎么能漂亮地打印JSON?


小智 13

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

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

要么

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

都会像下面这样美化输出(jq更加丰富多彩):

{
  "foo": "lorem",
  "bar": "ipsum"
}
Run Code Online (Sandbox Code Playgroud)

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


Uma*_*han 12

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

sudo apt-get install yajl-tools

然后,

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


Raf*_*iek 11

当您的系统上安装了节点时,以下工作。

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

{
  "test": 1,
  "test2": 2
}
Run Code Online (Sandbox Code Playgroud)


Han*_*Gay 10

yajl根据我的经验,这是非常好的.我通过在我的下面添加以下行json_reformat来使用它的命令来打印.json文件:vim.vimrc

autocmd FileType json setlocal equalprg=json_reformat
Run Code Online (Sandbox Code Playgroud)


fan*_*ing 10

在一行中使用Ruby:

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

您可以为此设置别名:

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

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

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

{
  "test": 1,
  "test2": 2
}
Run Code Online (Sandbox Code Playgroud)

如果你想要用颜色显示JSON,你可以安装awesome_print,

gem install awesome_print
Run Code Online (Sandbox Code Playgroud)

然后

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

试试吧!

echo '{"test":1,"test2":2, "arr":["aa","bb","cc"] }' | to_j
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


svi*_*gen 9

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
Run Code Online (Sandbox Code Playgroud)

  • 一个班轮:`echo'{"a":1,"b":2}'| php -r'echo json_encode(json_decode(fgets(STDIN)),JSON_PRETTY_PRINT)."\n";'` (2认同)

har*_*704 9

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

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

例如:

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


Pab*_*ook 8

我知道这个问题已被恶意回复,但我想记录一个比Json的美化命令更好的Ruby解决方案,宝石colorful_json相当不错.

gem install colorful_json
echo '{"foo": "lorem", "bar": "ipsum"}' | cjson
{
  "foo": "lorem",
  "bar": "ipsum"
}
Run Code Online (Sandbox Code Playgroud)


sla*_*ili 8

我正在使用httpie

$ pip install httpie
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它

 $ 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
 }
Run Code Online (Sandbox Code Playgroud)


Rob*_*uld 7

TidyJSON.

这是C#,所以也许你可以使用Mono进行编译,然后使用*nix.不过没有保证,抱歉.


pim*_*ttc 7

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

perl -0007 -MJSON -ne 'print objToJson(jsonToObj($_, {allow_nonref=>1}), {pretty=>1}), "\n";'
Run Code Online (Sandbox Code Playgroud)


adi*_*ius 7

对于 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}))}}))"
Run Code Online (Sandbox Code Playgroud)


Uly*_* BN 7

TL;DR:对于表演,使用jj -p < my.json.

基准

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

function bench {
    time (
      for i in {1..100}; do
        echo '{ "foo": "lorem", "bar": "ipsum" }'  | $@ > /dev/null
      done
    )
}
Run Code Online (Sandbox Code Playgroud)

这是我的 Mac(8 GB 2133 MHz LPDDR3,2.3 GHz Intel Core i5)上的结果:

bench python -m json.tool
# 3.60s user 1.24s system 88% cpu 5.448 total
bench jq
# 2.79s user 0.29s system 89% cpu 3.453 total
bench bat -p -l json
# 5.77s user 0.99s system 95% cpu 7.080 total
bench jj -p
# 0.19s user 0.26s system 85% cpu 0.529 total
bench xidel -s - -e '$json' --printed-json-format=pretty                      
# 1.27s user 0.77s system 91% cpu 2.234 total
Run Code Online (Sandbox Code Playgroud)

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


Bry*_*sen 6

$ sudo apt-get install edit-json
$ prettify_json myfile.json
Run Code Online (Sandbox Code Playgroud)


jos*_*sch 5

该工具ydump是一个JSON漂亮的打印机:

$ ydump my_data.json
{
  "foo": "lorem",
  "bar": "ipsum"
}
Run Code Online (Sandbox Code Playgroud)

或者你可以管道JSON:

$ echo '{"foo": "lorem", "bar": "ipsum"}' | ydump
{
  "foo": "lorem",
  "bar": "ipsum"
}
Run Code Online (Sandbox Code Playgroud)

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

这个工具是部分yojson图书馆OCaml的,并记录在这里.

关于Debian和衍生产品,该软件包libyojson-ocaml-dev包含此工具.或者,yojson可以通过OPAM安装.


Nik*_*jan 5

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

> vim 漂亮

#!/usr/bin/env node

console.log(JSON.stringify(JSON.parse(process.argv[2]), null, 2));
Run Code Online (Sandbox Code Playgroud)

添加执行权限:

> chmod +x 漂亮

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

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

#!/usr/bin/env node

console.log(JSON.stringify(require("./" + process.argv[2]), null, 2));
Run Code Online (Sandbox Code Playgroud)

> ./漂亮文件.json


Cal*_*och 5

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

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