如何使用jq根据键值对过滤JSON对象并保留原外层键名
解决方案
你可以通过to_entries和from_entries组合的方式保留外层键,具体写法如下:
echo '{"A": {"x": 1}, "B": {"x":2}, "C":{"x":3}}' | jq 'to_entries | map(select(.value.x == 2)) | from_entries'
逻辑说明
to_entries会将原JSON对象转换为键值对数组,每个元素的结构为{"key": "外层键名", "value": "键对应的值"},完整保留外层键和对应内容map(select(.value.x == 2))遍历键值对数组,筛选出值中x等于2的条目from_entries将筛选后的键值对数组转换回普通JSON对象,最终输出保留原外层键的结果
如果你的jq版本在1.5及以上,还可以用更简洁的with_entries语法,等效于上面的写法:
echo '{"A": {"x": 1}, "B": {"x":2}, "C":{"x":3}}' | jq 'with_entries(select(.value.x == 2))'
两种写法的运行结果都符合你的预期:
{ "B": { "x": 2 } }
内容的提问来源于stack exchange,提问作者lionel319
相关产品推荐
相关产品推荐

