如何使用JQ同时输出键名及对应值?筛选属性时保留外层键
问题根因
你写的筛选逻辑里用了.[]遍历对象,这个语法在遍历JSON对象时会自动丢弃外层键名,仅返回对应的值,所以筛选后自然丢失了test1、test4这类外层键。
正确JQ写法
直接执行下面的命令即可得到预期输出:
jq 'to_entries | map(select(.value.name | ascii_downcase | contains("john"))) | from_entries' 你的数据文件.json
逻辑说明
整个命令的执行流程分三步:
to_entries:将原始对象转换为键值对数组,每个数组元素的固定结构为{"key": "原外层键名", "value": "原键对应的内容"},转换后你原始的第一条数据就会变成{"key":"test1","value":{"name":"John"}}的形式map(select(...)):遍历上述键值对数组,保留value中name字段转小写后包含"john"的条目from_entries:将筛选后的键值对数组重新转换为普通JSON对象,还原成键和值一一对应的结构
补充优化
如果你需要精确匹配name值为John(而非模糊包含,比如contains("john")会把name为"johnny"的条目也匹配出来),可以把筛选条件改成精确相等判断,命令如下:
jq 'to_entries | map(select(.value.name | ascii_downcase == "john")) | from_entries' 你的数据文件.json
用你提供的样例数据执行上述命令,输出结果完全符合预期:
{ "test1": { "name": "John" }, "test4": { "name": "John" } }
内容的提问来源于stack exchange,提问作者bravesheeptribe
相关产品推荐
相关产品推荐

