当前位置:  开发笔记 > 前端 > 正文

按属性过滤对象,并使用jmespath中的键选择

如何解决《按属性过滤对象,并使用jmespath中的键选择》经验,为你挑选了2个好方法。

我正在尝试根据子属性的值过滤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 ]可以工作,它也只是属性值的数组,但我还需要键(ac).有没有办法在jmespath中实现这一点?

这是一个ansible playbook的所有部分,所以肯定会有一种方法以不同的方式实现选择(Jinja2模板或自定义插件),但我想尝试jmespath并且会推理它应该能够执行这样的任务.



1> Konstantin S..:

抱歉,AFAIK在原生JMESPath中是不可能的.在jq
这样的不同工具中有为此目的定制的内置函数. 对于Ansible而言,存在挂起请求以实现键操作.to_entries
jmespath.py

更新:我已经修改了json_query过滤器的版本.
有关其他信息,请参阅此答案.



2> techraf..:

使用dict2itemsAnsible 2.5及更高版本中的过滤器,您可以执行以下操作:

- debug:
    msg: "{{ dict(my_data | dict2items | json_query('[?value.feature.enabled].[key, value]')) }}"

结果:

"msg": {
    "a": {
        "feature": {
            "enabled": true
        }
    }
}

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有