如何删除除jq之外的所有键?

Wil*_*hes 18 json filtering key jq

给定一个对象列表,我不想要许多键:

[{
    "name": "Alice",
    "group": "Admins",
    "created": "2014"
}, {
    "name": "Bob",
    "group": "Users",
    "created": "2014"
}]
Run Code Online (Sandbox Code Playgroud)

如何过滤这些对象以仅包含我想要的键?

[{
    "name": "Alice"
}, {
    "name": "Bob"
}]
Run Code Online (Sandbox Code Playgroud)

我已经尝试jq '.[].name'但是提取值,而不是保留对象.

Gir*_*ish 21

您可以使用该map()功能过滤任何键:

jq 'map({name: .name})'
Run Code Online (Sandbox Code Playgroud)

更新

建议者@WilfredHughes:以上过滤器可以缩写如下:

jq 'map({name})'
Run Code Online (Sandbox Code Playgroud)

  • 啊,工作完美!你甚至可以将它缩短为`jq'map({name})'` (5认同)
  • 如果输入是字典,则为“jq '{name}'”。 (3认同)

Han*_* Z. 16

你可以使用mapdel如果你知道的钥匙你不想要的:

jq 'map(del (.group) | del (.created))'
Run Code Online (Sandbox Code Playgroud)


pea*_*eak 6

接受的答案(带有map)和 @mauricio-tranjano 的等效答案实际上会将指定的键添加到尚不具有该键的对象中。如果这不是您想要的行为,请考虑使用has(_),例如:

$ jq -c 'map( if has("a") then {a} else {} end )'
Run Code Online (Sandbox Code Playgroud)

输入:

[{id:1,a:1}, {id:2}]
Run Code Online (Sandbox Code Playgroud)

输出:

[{"a":1},{}]
Run Code Online (Sandbox Code Playgroud)


Mau*_*ano 5

另一种没有该map功能的解决方案:

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