如何根据 Ansible Jinja2 中的公共键值组合 2 个列表
How to combine 2 list based on a common key value in Ansible Jinja2
我正在尝试根据 JSON 数组中的公共键 (organizationId) 值将特定值组合到列表中。在这里,我使用 Jinja 模板创建一个 Json 文件,该文件将用于进一步处理。所以这里 sample.json 是 JSON 文件,test.j2(Jinja 模板)将从中获取值做一个最终的JSON(下面提到的预期输出)
Sample.json
[
{
"id": "111222333444627213",
"organizationId": "111222333444624074"
},
{
"id": "111222333444627214",
"organizationId": "111222333444624074"
},
{
"id": "111222333444627216",
"organizationId": "111222333444624074"
},
{
"id": "111222333444627217",
"organizationId": "12345678"
}
]
test.j2(神社)
[
{% for dict_item in sample.json %}
{
"orgid":"{{dict_item['organizationId']}}",
"objectIds":[
"{{ dict_item['id']}}"
]
}{% if not loop.last %},
{% endif %}
{% endfor %}
]
预期输出
[
{
"orgid":"111222333444624074",
"objectIds":[
"111222333444627213",
"111222333444627214",
"111222333444627216",
]
},
{
"orgid":"12345678",
"objectIds":[
"111222333444627217"
]
}
]
不需要 Jinja2。相反,迭代过滤器 groupby 创建的列表。例如
- set_fact:
output: "{{ output|d([]) + [{'orgid': item.0,
'objectIds': item.1|
map(attribute='id')|
list}] }}"
loop: "{{ sample.json|groupby('organizationId') }}"
给予
output:
- objectIds:
- '111222333444627213'
- '111222333444627214'
- '111222333444627216'
orgid: '111222333444624074'
- objectIds:
- '111222333444627217'
orgid: '12345678'
我正在尝试根据 JSON 数组中的公共键 (organizationId) 值将特定值组合到列表中。在这里,我使用 Jinja 模板创建一个 Json 文件,该文件将用于进一步处理。所以这里 sample.json 是 JSON 文件,test.j2(Jinja 模板)将从中获取值做一个最终的JSON(下面提到的预期输出)
Sample.json
[
{
"id": "111222333444627213",
"organizationId": "111222333444624074"
},
{
"id": "111222333444627214",
"organizationId": "111222333444624074"
},
{
"id": "111222333444627216",
"organizationId": "111222333444624074"
},
{
"id": "111222333444627217",
"organizationId": "12345678"
}
]
test.j2(神社)
[
{% for dict_item in sample.json %}
{
"orgid":"{{dict_item['organizationId']}}",
"objectIds":[
"{{ dict_item['id']}}"
]
}{% if not loop.last %},
{% endif %}
{% endfor %}
]
预期输出
[
{
"orgid":"111222333444624074",
"objectIds":[
"111222333444627213",
"111222333444627214",
"111222333444627216",
]
},
{
"orgid":"12345678",
"objectIds":[
"111222333444627217"
]
}
]
不需要 Jinja2。相反,迭代过滤器 groupby 创建的列表。例如
- set_fact:
output: "{{ output|d([]) + [{'orgid': item.0,
'objectIds': item.1|
map(attribute='id')|
list}] }}"
loop: "{{ sample.json|groupby('organizationId') }}"
给予
output:
- objectIds:
- '111222333444627213'
- '111222333444627214'
- '111222333444627216'
orgid: '111222333444624074'
- objectIds:
- '111222333444627217'
orgid: '12345678'