如何使用json_query过滤器提取所有等于一个值的项



这是我的json输出:

{
"kind": [
{
"inventory": "",
"inventory_sources": "",
"job_templates": "",
"workflow_job_templates": "104"
},
{
"inventory": "",
"inventory_sources": "",
"job_templates": "114",
"workflow_job_templates": ""
},
{
"inventory": "24",
"inventory_sources": "",
"job_templates": "",
"workflow_job_templates": ""
},
{
"inventory": "",
"inventory_sources": "108",
"job_templates": "",
"workflow_job_templates": ""
}
]
}

我想显示包含特定值的所有项目名称。例如,对于搜索值104,我想获得键名workflow_job_templates

我测试了一些语法,但没有成功:

- debug: 
msg: "104 is {{kind|json_query(query)}}"
vars:
query: "[?*==`104`].workflow_job_templates"

我知道这是错误的,但谁能告诉我他会为自己做什么?

json_query可能是解决方案的一部分,但这里确实不需要。

下面这段代码的解释:

  • 对列表中的每个元素应用dict2items过滤器。这将每个映射转换为{key: "key", value: "value"}对列表
  • 将给定的列表扁平化,这样我们就可以将所有这些元素放到一个单一的顶层
  • 选择值为'104'的元素
  • 提取列表中每个元素的key属性
  • 使该列表唯一并排序。
- name: Display all element having a value of 104
debug:
msg: "{{ kind | map('dict2items') | flatten
| selectattr('value', '==', '104')
| map(attribute='key') | unique | sort }}"

请注意,如果相同的键名有不同的值,但其中一个是' 104,则此解决方案将给出结果。使用上述数据,结果是:

TASK [Display all element having a value of 104] ***************************************************************************************************************************************************************************************
ok: [localhost] => {
"msg": [
"workflow_job_templates"
]
}

(Update)

下面的任务

- debug:
msg: "{{ item }} {{ kind|
map('dict2items')|
map('json_query', query)|
flatten }}"
loop: [104, 114, 108, 24]
vars:
query: "[?to_string(value) == to_string('{{ item }}')].key"

msg: 104 ['workflow_job_templates']
msg: 114 ['job_templates']
msg: 108 ['inventory_sources']
msg: 24 ['inventory']

(郑重声明。蛮力方法)

创建一个唯一的键列表

- set_fact:
my_keys: "{{ my_keys|default([]) + item.keys()|list }}"
loop: "{{ kind }}"
- set_fact:
my_keys: "{{ my_keys|unique }}"

my_keys:
- inventory
- inventory_sources
- job_templates
- workflow_job_templates

创建一个包含所有值的字典

- set_fact:
my_dict: "{{ my_dict|default({})|combine({item: values}) }}"
loop: "{{ my_keys }}"
vars:
query: "[].{{ item }}"
values: "{{ kind|json_query(query) }}"

my_dict:
inventory:
- ''
- ''
- '24'
- ''
inventory_sources:
- ''
- ''
- ''
- '108'
job_templates:
- ''
- '114'
- ''
- ''
workflow_job_templates:
- '104'
- ''
- ''
- ''

然后搜索字典。例如

- debug:
msg: "{{ item }} {{ my_dict|dict2items|json_query(query) }}"
loop: [104, 114, 108, 24]
vars:
query: "[?value[?contains(@, '{{ item }}')]].key"

msg: 104 ['workflow_job_templates']
msg: 114 ['job_templates']
msg: 108 ['inventory_sources']
msg: 24 ['inventory']

使用json_query的正确选择是:

- debug:
msg: "{{ kind | map('dict2items') | flatten | json_query(query)}}"
vars:
- query: "[?value == `"104"`].key"

相关内容

最新更新