jq 将结果输出为 JSON

xpt*_*xpt 5 json stream jq

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

有什么解决方法吗?

更新:

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

{ "Commits": [ {...}, {...}, {...} ] }
Run Code Online (Sandbox Code Playgroud)

我试过了:

jq '.[] | Commits: [{message: .commit.message, name: .commit.committer.name}]'
jq 'Commits: [.[] | {message: .commit.message, name: .commit.committer.name}]'
Run Code Online (Sandbox Code Playgroud)

但两者都不起作用。

xpt*_*xpt 6

找到了,在同一页,

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

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

jq '[.[] | {message: .commit.message, name: .commit.committer.name}]'
Run Code Online (Sandbox Code Playgroud)


pea*_*eak 5

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

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

对更新的回应

要生成表单的 JSON 对象:

{ "Commits": [ {...}, {...}, {...} ] }
Run Code Online (Sandbox Code Playgroud)

你可以这样写:

jq '{Commits: [.[] | {message: .commit.message, name: .commit.committer.name}]}'
Run Code Online (Sandbox Code Playgroud)

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