在 Unix shell 脚本中以可读的 JSON 格式显示 curl 输出

Posted

技术标签:

【中文标题】在 Unix shell 脚本中以可读的 JSON 格式显示 curl 输出【英文标题】:Display curl output in readable JSON format in Unix shell script 【发布时间】:2015-01-30 01:11:44 【问题描述】:

在我的 Unix shell 脚本中,当我执行 curl 命令时,结果将显示如下,我正在重定向到文件:

"type":"Show","id":"123","title":"name","description":"Funny","channelTitle":"ifood.tv","lastUpdateTimestamp":"2014-04-20T20:34:59","numOfVideos":"15"

但是,我希望此输出以可读的 JSON 格式放入文件中,如下所示:

"type":"Show",
"id":"123",
"title":"name",
"description":"Funny",
"channelTitle":"ifood.tv",
"lastUpdateTimestamp":"2014-04-20T20:34:59",
"numOfVideos":"15"

如何以这种方式格式化输出?

【问题讨论】:

【参考方案1】:

一些解决方案可供选择:

json_pp:Linux 系统中用于 JSON 解码/编码的命令实用程序

echo '"type":"Bar","id":"1","title":"Foo"' | json_pp -json_opt pretty,canonical

   "id" : "1",
   "title" : "Foo",
   "type" : "Bar"

您可能希望保留 -json_opt pretty,canonical 参数以实现可预测的排序。


jq:轻量级且灵活的命令行 JSON 处理器。它是用可移植的 C 语言编写的,运行时依赖为零。

echo '"type":"Bar","id":"1","title":"Foo"' | jq '.'

  "type": "Bar",
  "id": "1",
  "title": "Foo"

最简单的jq 程序是表达式.,它接受输入并将其作为输出原样生成。

对于额外的jq 选项检查the manual


python:

echo '"type":"Bar","id":"1","title":"Foo"' | python -m json.tool

    "id": "1",
    "title": "Foo",
    "type": "Bar"


与nodejs 和bash:

echo '"type":"Bar","id":"1","title":"Foo"' | node -e "console.log( JSON.stringify( JSON.parse(require('fs').readFileSync(0) ), 0, 1 ))"

 "type": "Bar",
 "id": "1",
 "title": "Foo"

【讨论】:

是这样吗?curl -i -vs -X POST -H "$SESSION_TOKEN" -H "$AUTH_TOKEN" -H "Accept:$ACCEPT_HEADER" -H "Content-Type:text/普通" "http://$BASE_URI/api" | json_pp >> jsonoutput.json 当然。你测试过吗? 是的,但没有写入文件“jsonoutput.json”。它的大小为零。 json_pp 似乎以与预期相反的顺序格式化数据。有没有办法取消反转数据? json_pp 是一个 Perl 命令实用程序,可在某些输入和输出格式(其中一种 JSON)之间进行转换。默认输入格式为json,默认输出格式为带有漂亮选项的json。【参考方案2】:

我猜你想美化 JSON 输出。 这可以使用 python 来实现:

curl http://localhost:8880/test.json | python -mjson.tool > out.json

【讨论】:

感谢您的回答。但我没有使用 Python,我使用的是 shell。你能在 shell 上指导我吗 @Jams 从 shell 执行 python 给你一个漂亮的打印输出。 预装了 python 的绝佳解决方案。 当我向它添加“|head”时,python 脚本给出了“破管”错误。 @CrouchingKitten 我自己没有看到这个问题(可能是不同的版本),但这可能是由于head 命令在到达结束之前切断了输出,因此“打破”管道。如果您允许head 使用管道中的整个数据流,我希望错误不会出现。【参考方案3】:

这是对 Gilles 回答的补充。有很多方法可以做到这一点,但我个人更喜欢在常见的 *nix 系统上使用轻量级、易于记忆和普遍可用的东西(例如,附带您喜欢的 Linux 风格的标准 LTS 安装或易于安装)。

以下是按首选顺序排列的选项:

Python Json.tool 模块

echo '"foo": "lorem", "bar": "ipsum"' | python -mjson.tool

优点:几乎随处可见;缺点:没有颜色编码


jq(可能需要一次安装)

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

缺点:需要安装jq;优点:颜色编码和多功能


json_pp(在 Ubuntu 16.04 LTS 中可用)

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

对于 Ruby 用户

gem install jsonpretty
echo '"foo": "lorem", "bar": "ipsum"' | jsonpretty

【讨论】:

谢谢@zhenhua!我使用cat myFile.json | python -mjson.tool >> myFilePretty.json 然后在我的编辑器中打开(vim,不要讨厌)并得到颜色。【参考方案4】:
python -m json.tool
Curl http://127.0.0.1:5000/people/api.json | python -m json.tool

也可以帮忙。

【讨论】:

【参考方案5】:

你可以使用the json node module:

npm i -g json

然后在 curl 之后简单地附加 | jsoncurl http://localhost:8880/test.json | json

【讨论】:

如果你不推荐它,我会删除关于 sudo 的评论和部分哈哈。我同意没有必要。感谢您的回答 如果你不想安装json模块,你可以直接和npx一起使用:curl http://localhost:8880/test.json | npx json【参考方案6】:

我发现 json_reformat 非常方便。所以我只是做了以下事情:

curl http://127.0.0.1:5000/people/api.json | json_reformat

就是这样!

【讨论】:

如果使用 Ubuntu,您可以在 yajl-tools 包中找到 json_reformat。【参考方案7】:

动机:您想在 curl 命令请求后打印 prettify JSON 响应。

解决方案json_pp - 在某些输入和输出格式(其中之一是 JSON)之间转换的命令行工具。该程序是从 json_xs 复制并修改的。默认输入格式为json,默认输出格式为带有漂亮选项的json。

概要json_pp [-v] [-f from_format] [-t to_format] [-json_opt options_to_json1[,options_to_json2[,...]]]

公式<someCommand> | json_pp

示例

请求

curl -X https://jsonplaceholder.typicode.com/todos/1 | json_pp 

回应


   "completed" : false,
   "id" : 1,
   "title" : "delectus aut autem",
   "userId" : 1

【讨论】:

【参考方案8】:

查看curljson

$ pip install curljson
$ curljson -i <the-json-api-url>

【讨论】:

【参考方案9】:

与xidel:

curl <...> | xidel - -se '$json'

xidel 可能也可以为您检索 JSON。

【讨论】:

【参考方案10】:

除了格式化之外,还有更多功能(切片、过滤器和映射以及转换结构化)。

https://stedolan.github.io/jq/

【讨论】:

【参考方案11】:

您可以安装 jq 并进行如下查询:

curl http://localhost:8080/observations/station/221 | jq

【讨论】:

以上是关于在 Unix shell 脚本中以可读的 JSON 格式显示 curl 输出的主要内容,如果未能解决你的问题,请参考以下文章

使用脚本以可读的 JSON 格式显示 curl 命令输出

PHP 以可读的html格式打印数组

在 Swift 5 中,如何以可读的方式(使用整数)显示从 range.UpperBound 或 range.LowerBound 返回的原始位?

有没有办法以可读的形式从 .NET 程序集中检索编译器生成的代码?

在 Mac OSX 上将 unix 纪元时间转换为人类可读的日期 - BSD

人类可读的 JSON:又名在 json 转储中添加空格和中断