jq 以 JSON 格式输出结果

Posted

技术标签:

【中文标题】jq 以 JSON 格式输出结果【英文标题】:jq to output results as JSON 【发布时间】:2018-08-26 18:47:46 【问题描述】:

jq 应该是

处理/过滤 JSON 输入并生成过滤器的结果作为 JSON

但是,我发现在jq 处理/过滤之后,输出结果不再是JSON 格式。

例如,https://stedolan.github.io/jq/tutorial/#result5,即,

$ curl -s 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.[] | message: .commit.message, name: .commit.committer.name'

  "message": "Merge pull request #162 from stedolan/utf8-fixes\n\nUtf8 fixes. Closes #161",
  "name": "Stephen Dolan"


  "message": "Reject all overlong UTF8 sequences.",
  "name": "Stephen Dolan"

. . . 

有什么解决方法吗?

更新:

如何将整个return包装成一个json结构:

 "Commits": [ ..., ..., ... ] 

我试过了:

jq '.[] | Commits: [message: .commit.message, name: .commit.committer.name]'
jq 'Commits: [.[] | message: .commit.message, name: .commit.committer.name]'

但两者都不起作用。

【问题讨论】:

这个 Q/A 帮助我找到了 better Github search approach,仅供参考。 【参考方案1】:

在同一页面上找到它,

https://stedolan.github.io/jq/tutorial/#result6

如果您想将输出作为单个数组获取,您可以告诉 jq 通过将过滤器包裹在方括号中来“收集”所有答案:

jq '[.[] | message: .commit.message, name: .commit.committer.name]'

【讨论】:

【参考方案2】:

从技术上讲,除非另有说明(特别是使用 -r 命令行选项),否则 jq 会生成 JSON 实体的

将 JSON 实体的输入流转换为包含它们的 JSON 数组的一种方法是使用 -s 命令行选项。

对更新的响应

要产生一个 JSON 对象的形式:

 "Commits": [ ..., ..., ... ] 

你可以这样写:

jq 'Commits: [.[] | message: .commit.message, name: .commit.committer.name]'

(jq 理解 'Commits: _' 的简写。)

【讨论】:

以上是关于jq 以 JSON 格式输出结果的主要内容,如果未能解决你的问题,请参考以下文章

jq处理JSON数据

csv格式的JQ查询输出

LinuxLinux JSON 格式化输出

Linux json解析jq

json格式化

如何删除 jq 输出中的双引号以在 bash 中解析 json 文件?