如何使用bash/jq根据子list属性值筛选JSON根列表元素
jq 基于子对象数组属性筛选根列表元素的实现
给定测试JSON数据如下:
[ { "prop1": "prop11", "prop2": "prop21", "list": ["element1", "element2", "element3"] }, { "prop1": "prop12", "prop2": "prop22", "list": ["element1", "element3"] }, { "prop1": "prop13", "prop2": "prop23", "list": ["element2", "element3"] } ]
要筛选list属性包含指定值(示例中为element1)的根元素,核心是通过select过滤器匹配符合条件的数组项,根据需要的输出格式选择对应命令即可:
- 输出带外层数组的格式化结果:使用方括号将筛选结果重新包裹为数组,命令如下:
jq '[.[] | select(.list | index("element1"))]' input.json
执行后返回格式化的数组结构,和示例预期完全一致:
[ { "prop1": "prop11", "prop2": "prop21", "list": [ "element1", "element2", "element3" ] }, { "prop1": "prop12", "prop2": "prop22", "list": [ "element1", "element3" ] } ]
兼容说明:如果使用的jq版本较低不支持数组直接调用
index,可以把判断条件替换为.list | any(. == "element1");jq 1.6及以上版本还可以用可读性更高的写法select("element1" IN .list),效果完全相同。
- 输出逐行单个对象的NDJSON格式:去掉外层包裹结果的方括号,加上
-c参数启用紧凑输出(避免格式化换行),命令如下:
jq -c '.[] | select(.list | index("element1"))' input.json
执行后每个符合条件的对象单独占一行输出,无多余格式:
{"prop1":"prop11","prop2":"prop21","list":["element1","element2","element3"]} {"prop1":"prop12","prop2":"prop22","list":["element1","element3"]}
如果需要匹配其他目标值,直接替换命令中"element1"为对应内容即可,数字、布尔类型的匹配值不需要加引号。
内容的提问来源于stack exchange,提问作者patodomau
相关产品推荐
相关产品推荐

