You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 21:13:26