Jinja2 - 列表中的缩进和递归循环
Jinja2 - Indentation and recursive loop from a list
该查询主要与 Jinja2 有关,通过循环递归并将元素添加到递归 JSON 类型格式中。
例如,得到一个管道分隔 list/data,这是一个“管道分隔的层次结构”,如下所示
World|North_America|USA|Texas
World|Europe|UK|England|London
World|Australia
层次结构可以是任何级别,我想通过使用 Jinja2 模板
获得基于层次结构的 JSON 格式
我试过的是
{% for item in pipe_separated_hierarchy.split('|') %}
"obj_{{loop.index}}": {
"{{item}}": {
"my_description_obj{{loop.index}}",
"obj_{{loop.index}}": {
<<<loop from 2nd iteration again >>> # not sure how to loop.index & item ?
}
{% endfor %}
我正在寻找输出
"obj_1": {
"World": {
"obj_2": {
"North_America": {
"obj_3": {
"USA": {
"obj_4": "Texas"
}
}
}
}
}
}
知道如何循环遍历列表同时保持计数和缩进吗?
例如
- hosts: localhost
vars:
l1:
- World|North_America|USA|Texas
- World|Europe|UK|England|London
- World|Australia
tasks:
- debug:
var: _out|from_yaml
loop: "{{ l1 }}"
vars:
_list: "{{ item.split('|') }}"
_len: "{{ _list|length }}"
_out: |
{% for i in range(_len|int) %}
{{ 'obj_'|indent(width=(i*4),first=true) }}{{ i+1 }}:
{{ _list[i]|indent(width=(i*4),first=true) }}{{ ":" if not loop.last else "" }}
{% endfor %}
给予
ok: [localhost] => (item=World|North_America|USA|Texas) => {
"_out|from_yaml": {
"obj_1": {
"World": {
"obj_2": {
"North_America": {
"obj_3": {
"USA": {
"obj_4": "Texas"
}
}
}
}
}
}
},
"ansible_loop_var": "item",
"item": "World|North_America|USA|Texas"
}
ok: [localhost] => (item=World|Europe|UK|England|London) => {
"_out|from_yaml": {
"obj_1": {
"World": {
"obj_2": {
"Europe": {
"obj_3": {
"UK": {
"obj_4": {
"England": {
"obj_5": "London"
}
}
}
}
}
}
}
}
},
"ansible_loop_var": "item",
"item": "World|Europe|UK|England|London"
}
ok: [localhost] => (item=World|Australia) => {
"_out|from_yaml": {
"obj_1": {
"World": {
"obj_2": "Australia"
}
}
},
"ansible_loop_var": "item",
"item": "World|Australia"
}
该查询主要与 Jinja2 有关,通过循环递归并将元素添加到递归 JSON 类型格式中。
例如,得到一个管道分隔 list/data,这是一个“管道分隔的层次结构”,如下所示
World|North_America|USA|Texas
World|Europe|UK|England|London
World|Australia
层次结构可以是任何级别,我想通过使用 Jinja2 模板
获得基于层次结构的 JSON 格式我试过的是
{% for item in pipe_separated_hierarchy.split('|') %}
"obj_{{loop.index}}": {
"{{item}}": {
"my_description_obj{{loop.index}}",
"obj_{{loop.index}}": {
<<<loop from 2nd iteration again >>> # not sure how to loop.index & item ?
}
{% endfor %}
我正在寻找输出
"obj_1": {
"World": {
"obj_2": {
"North_America": {
"obj_3": {
"USA": {
"obj_4": "Texas"
}
}
}
}
}
}
知道如何循环遍历列表同时保持计数和缩进吗?
例如
- hosts: localhost
vars:
l1:
- World|North_America|USA|Texas
- World|Europe|UK|England|London
- World|Australia
tasks:
- debug:
var: _out|from_yaml
loop: "{{ l1 }}"
vars:
_list: "{{ item.split('|') }}"
_len: "{{ _list|length }}"
_out: |
{% for i in range(_len|int) %}
{{ 'obj_'|indent(width=(i*4),first=true) }}{{ i+1 }}:
{{ _list[i]|indent(width=(i*4),first=true) }}{{ ":" if not loop.last else "" }}
{% endfor %}
给予
ok: [localhost] => (item=World|North_America|USA|Texas) => {
"_out|from_yaml": {
"obj_1": {
"World": {
"obj_2": {
"North_America": {
"obj_3": {
"USA": {
"obj_4": "Texas"
}
}
}
}
}
}
},
"ansible_loop_var": "item",
"item": "World|North_America|USA|Texas"
}
ok: [localhost] => (item=World|Europe|UK|England|London) => {
"_out|from_yaml": {
"obj_1": {
"World": {
"obj_2": {
"Europe": {
"obj_3": {
"UK": {
"obj_4": {
"England": {
"obj_5": "London"
}
}
}
}
}
}
}
}
},
"ansible_loop_var": "item",
"item": "World|Europe|UK|England|London"
}
ok: [localhost] => (item=World|Australia) => {
"_out|from_yaml": {
"obj_1": {
"World": {
"obj_2": "Australia"
}
}
},
"ansible_loop_var": "item",
"item": "World|Australia"
}