如何使用jq过滤含慕尼黑/巴黎的JSON对象(排除无location项)
使用jq筛选包含指定城市的JSON对象
问题背景
给定如下JSON数据:
{ "FOO": { "name": "Donald", "location": ["Stockholm","London"] }, "BAR": { "name": "Walt", "location": ["Stockholm","Munich"] }, "BAZ": { "name": "Jack", "location": ["Munich","Paris"] }, "BUZ": { "name": "John", "location": ["London","Paris"] }, "QUX": { "name": "Mickey" } }
需要筛选出满足以下条件的对象:
- 包含
location字段 location数组中包含Munich或Paris
期望得到的结果:
{ "BAR": { "name": "Walt", "location": ["Stockholm","Munich"] }, "BAZ": { "name": "Jack", "location": ["Munich","Paris"] }, "BUZ": { "name": "John", "location": ["London","Paris"] } }
尝试用or操作时出现了重复输出,如何正确实现需求?
正确的jq命令
你可以用以下两种方式实现需求:
方式一:逻辑或判断
jq 'with_entries(select(.value.location and (.value.location[] == "Munich" or .value.location[] == "Paris")))'
方式二:使用IN操作符(更简洁)
jq 'with_entries(select(.value.location and (.value.location[] | IN("Munich", "Paris"))))'
重复输出的原因
如果直接写select(.value.location[] == "Munich" or .value.location[] == "Paris"),location[]会遍历数组中的每个元素。当一个对象的location同时包含Munich和Paris时(比如BAZ),会触发两次匹配判断,导致该对象被重复输出。
而上面的写法通过with_entries配合单次条件判断,确保每个对象只被检查一次,同时.value.location的判断会自动排除没有location字段的对象(比如QUX)。
效果验证
将上述命令作用于原始JSON,就能得到你期望的输出:无重复对象,且排除了没有location字段的条目。
内容的提问来源于stack exchange,提问作者Patrick Szalapski
相关产品推荐
相关产品推荐

