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)
但两者都不起作用。
找到了,在同一页,
https://stedolan.github.io/jq/tutorial/#result6
如果您想将输出作为单个数组,您可以通过将过滤器括在方括号中来告诉 jq “收集”所有答案:
jq '[.[] | {message: .commit.message, name: .commit.committer.name}]'
Run Code Online (Sandbox Code Playgroud)
从技术上讲,除非另有说明(特别是使用-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: _}' 简写。)