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

如何使用JMESPath过滤带有至少一个标签的Consul服务?

解决JMESPath过滤Consul非空标签服务的问题

我来帮你搞定这个JMESPath的过滤问题!你之前尝试的json.[length(*)>0]没法得到预期结果,是因为JMESPath不能直接这样筛选对象的键值对——得先把对象转换成键值对数组,过滤后再转回对象才行。

正确的JMESPath表达式

json | entries(@) | [?length(value) > 0] | from_entries(@) | { json: @ }

分步解释每个部分:

  • json:先定位到原数据中的json对象;
  • entries(@):把对象转换成键值对数组,格式会变成[{ "key": "consul", "value": [] }, { "key": "consul-8600", "value": ["traefik.enable=false", "udp"] }, ...];
  • [?length(value) > 0]:过滤数组中value(也就是服务的标签数组)长度大于0的项;
  • from_entries(@):把过滤后的键值对数组重新转换成对象;
  • { json: @ }:把结果包装回和原数据一致的{json: ...}结构。

测试验证

把你的原始JSON输入进去,用这个表达式就能得到你想要的结果:

{ "json": { "consul-8600": [ "traefik.enable=false", "udp" ] } }

为什么你的原表达式不生效?

你写的json.[length(*)>0]语法有误:*在这里会获取json下所有属性的值,但length(*)并不是对每个值单独计算长度,而且这种写法无法直接筛选出符合条件的键值对——JMESPath对对象的筛选必须通过键值对数组的转换来实现。

内容的提问来源于stack exchange,提问作者Riduidel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:56:33