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

时间:2015-01-08 10:41:45

标签: json key filtering jq

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

[{
    "name": "Alice",
    "group": "Admins",
    "created": "2014"
}, {
    "name": "Bob",
    "group": "Users",
    "created": "2014"
}]

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

[{
    "name": "Alice"
}, {
    "name": "Bob"
}]

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

4 个答案:

答案 0 :(得分:19)

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

jq 'map({name: .name})'

更新

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

jq 'map({name})'

答案 1 :(得分:15)

如果您知道自己不想要的密钥,可以map使用del

jq 'map(del (.group) | del (.created))'

答案 2 :(得分:3)

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

jq '[.[] | {name: .name}]'

答案 3 :(得分:3)

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

$ jq -c 'map( if has("a") then {a} else {} end )'

输入:

[{id:1,a:1}, {id:2}]

输出:

[{"a":1},{}]