解析嵌套JSON字典



我试图获得在Ansible中给定JSON中满足特定标准的接口名称,使用jmesquery。

问题是列表中的项目是命名的,它不是一个包含每个项目的所有值的列表,并且无法计算如何过滤它。

条件为vlan == "1">这个JSON应该给出输出['GigabitEthernet0/0', 'GigabitEthernet0/1']

使用dict2items(如@mdaniel建议)后,我设法应用条件过滤器,但我正在努力检索现在在:

中的接口名称
- name: PRINT
debug:
msg: "{{ jsondata.interfaces | dict2items | json_query( query ) }}"
vars:
query: >-
[][value][?vlan=='1']

JSON

interfaces: {
"GigabitEthernet0/0": {
"duplex_code": "auto",
"port_speed": "a-100",
"status": "connected",
"type": "10/100/1000BaseTX",
"vlan": "1"
},
"GigabitEthernet0/1": {
"duplex_code": "auto",
"port_speed": "a-100",
"status": "connected",
"type": "10/100/1000BaseTX",
"vlan": "1"
} 
}

应用jsondata.interfaces | dict2items后的JSON

[
{
"key": GigabitEthernet0/0",
"value": {
"duplex_code": "auto",
"port_speed": "a-100",
"status": "connected",
"type": "10/100/1000BaseTX",
"vlan": "1"
}
},
{
"key": GigabitEthernet0/1",
"value": {
"duplex_code": "auto",
"port_speed": "a-100",
"status": "connected",
"type": "10/100/1000BaseTX",
"vlan": "1"
}
}
]

提前感谢!

几个解决方案:

- name: set_fact 
set_fact:
result: "{{ result | d([]) + [item.key] }}"
loop: "{{ lookup('dict', jsondata.interfaces) }}"
when: "'1' == item.value.vlan"

或使用jinja2循环:

- name: build
set_fact:
result: "{{ _request.strip(',').split(',') }}"
vars:
_query: "1"
_request: >-
{%- for k in jsondata.interfaces -%}
{%-   if jsondata.interfaces[k].vlan == _query -%}
{{ k }},
{%-   endif  -%}
{%- endfor  -%}  

结果:

ok: [localhost] => 
result:
- GigabitEthernet0/0
- GigabitEthernet0/1

例如,下面的任务列出vlan=='1'

的键
- debug:
msg: "{{ interfaces|dict2items|
selectattr('value.vlan', 'eq', '1')|
map(attribute='key')|list }}"

最新更新