json 过滤掉嵌套对象中的节

lx0bsm1f  于 2023-05-30  发布在  其他
关注(0)|答案(1)|浏览(123)

下面是json:

{
  "foo": {},
  "bar": {
    "a": {
      "tags": [
        "x",
        "y"
      ],
      "cycle": "simple"
    },
    "b": {
      "tags": [
        "x"
      ],
      "cycle": null
    }
  },
  "baz": {
    "c": {
      "tags": [
        "y"
      ],
      "cycle": null
    }
  },
  "qux": {
    "d": {
      "tags": [
        "x",
        "y",
        "z"
      ],
      "cycle": "complex"
    }
  }
}

我想删除顶层对象中所有具有"cycle == null"的对象。在过滤"cycle"时,我不知道如何访问早期过滤器中的字段:

$ jq '.[] | .[] | select(.cycle != null)' data.json
{
  "tags": [
    "x",
    "y"
  ],
  "cycle": "simple"
}
{
  "tags": [
    "x",
    "y",
    "z"
  ],
  "cycle": "complex"
}

我想保留匹配条目的结构,类似于以下内容:

{
  "bar": {
    "a": {
      "tags": [
        "x",
        "y"
      ],
      "cycle": "simple"
    }
  },
  "qux": {
    "d": {
      "tags": [
        "x",
        "y",
        "z"
      ],
      "cycle": "complex"
    }
  }
}

我希望写类似于jq '.*.*. | select(.cycle != null)'的东西,这样我就不需要手动重新组装原始结构,但我不理解通配符。

bnl4lu3b

bnl4lu3b1#

.[] |= …(或map_values(…))允许您操作对象的内容,而不会丢失外部结构。嵌套两次,以达到两个级别的深度。select(.cycle != null)是您的主过滤器,但我还在中间级别添加了select(. != {}),因为您想要的输出不包括"foo": {}

jq '.[] |= (.[] |= select(.cycle != null) | select(. != {}))'
{
  "bar": {
    "a": {
      "tags": [
        "x",
        "y"
      ],
      "cycle": "simple"
    }
  },
  "qux": {
    "d": {
      "tags": [
        "x",
        "y",
        "z"
      ],
      "cycle": "complex"
    }
  }
}

Demo

相关问题