json - Jinja2 - 列表中的缩进和递归循环

标签 json ansible jinja2

该查询主要与 Jinja2 相关,通过循环进行递归并将元素添加为递归 JSON 类型格式。

例如,得到一个管道分隔的列表/数据,它是一个“管道分隔的层次结构”,如下所示

    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"
}

关于json - Jinja2 - 列表中的缩进和递归循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66461097/

相关文章:

java - JSR-303 @有效注释不适用于子对象列表

android - RecyclerView 无限无限滚动问题

ansible:任务命名风格

python - 你如何使用 jinja2 显示 markdown 值?

python - webapp2,Jinja2 : how to cut large html file into multiple html files

python - 如何在当前页面的 Pelican 站点顶部生成所有语言的链接(文章)

json - Bittrex API - Swift 中的 JSON 结构

java - Servlet 使用 getParameter 获取 json 数组

ansible - 当 'changed' -ing 变量时如何防止 'register' 标志?

ansible - 如何从用户定义的 ansible.cfg 设置 ansible_config 变量