我正在尝试根据子属性的值过滤jmespath中对象的属性,并且只想包含子属性设置为特定值的那些属性.
基于此示例数据:
{ "a": { "feature": { "enabled": true, } }, "b": { }, "c": { "feature": { "enabled": false } } }
我想获得一个具有启用该功能的所有属性的对象.
{ "a": { "feature": { "enabled": true, } } }
我想我可以使用这个jmespath查询来过滤property. enabled
设置为true 的对象.不幸的是,它似乎不起作用而是返回一个空数组.
*[?feature.enabled==`true`]
*.feature.enabled
或者*[feature.enabled]
只返回没有任何上下文的布尔值.
即使*[?feature.enabled==
true ]
可以工作,它也只是属性值的数组,但我还需要键(a
和c
).有没有办法在jmespath中实现这一点?
这是一个ansible playbook的所有部分,所以肯定会有一种方法以不同的方式实现选择(Jinja2模板或自定义插件),但我想尝试jmespath并且会推理它应该能够执行这样的任务.
抱歉,AFAIK在原生JMESPath中是不可能的.在jq
这样的不同工具中有为此目的定制的内置函数.
对于Ansible而言,存在挂起请求以实现键操作.to_entries
jmespath.py
更新:我已经修改了json_query过滤器的版本.
有关其他信息,请参阅此答案.
使用dict2items
Ansible 2.5及更高版本中的过滤器,您可以执行以下操作:
- debug: msg: "{{ dict(my_data | dict2items | json_query('[?value.feature.enabled].[key, value]')) }}"
结果:
"msg": { "a": { "feature": { "enabled": true } } }