如何使用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
相关产品推荐
相关产品推荐

