协慌网

登录 贡献 社区

如何在(Unix)shell 脚本中打印 JSON?

是否有(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的 “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');

从带有 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));\
 });\
"