在 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 之后简单地附加 | json
。
curl 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 输出的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 5 中,如何以可读的方式(使用整数)显示从 range.UpperBound 或 range.LowerBound 返回的原始位?
有没有办法以可读的形式从 .NET 程序集中检索编译器生成的代码?