首页 > 解决方案 > json 文件上的 Jinja2 模板

问题描述

我正在尝试在 json 上运行 jinja 2 模板。这是我拥有的 json 文件:

{
"results": [
    {
        "Apps": [
                  {
            "owner": "owner1",
            "AppNm": "App1"
          }
                ],
        "server": "server1"
    },
        {
        "Apps": [
                  {
            "owner": "owner3",
            "AppNm": "App1"
          },
                  {
            "owner": "owner2",
            "AppNm": "App2"
          }
                ],
        "server": "server2"
        }
  ]
}

这是我正在使用的模板:

{%- set app_srv = {} -%}
{%- set apps_list = [] -%}
{%- set owners_list = [] -%}

{%- for srv_chg in server_changes.results -%}
        {%- for srv_chg_item in srv_chg.Apps -%}
                {%- if srv_chg_item.AppNm not in apps_list -%}
                        {{ apps_list.append( srv_chg_item.AppNm ) }}
                {%- endif -%}
        {%- endfor -%}
{%- endfor -%}

{%- for apps_item in apps_list -%}
        {%- for srv_chg in server_changes.results -%}
                {%- for srv_chg_item in srv_chg.Apps -%}
                        {%- if srv_chg_item.owner not in owners_list and srv_chg_item.AppNm == apps_item -%}
                                {{ owners_list.append( srv_chg_item.owner ) }}
                        {%- endif -%}
                {%- endfor -%}
        {%- endfor -%}
        {{ app_srv.update({apps_item: {'owner': owners_list}}) }}
{%- endfor -%}

{{ app_srv|to_nice_json }}

基本思想是以应用程序/服务器而不是服务器/应用程序的方式重新组织 json。

这是我从模板中得到的输出:

{
    "App1": {
        "owner": [
            "owner1",
            "owner3",
            "owner2"
        ]
    },
    "App2": {
        "owner": [
            "owner1",
            "owner3",
            "owner2"
        ]
    }
}

这是我需要的模板输出:

{
    "App1": {
        "owner": [
            "owner1",
            "owner3"
        ]
    },
    "App2": {
        "owner": [
            "owner2"
        ]
    }
}

我遇到了owner_list的问题。我认为当apps_list循环时,owners_list将重置。我不明白在那种情况下如何管理列表。

任何帮助将不胜感激,谢谢。

标签: jsontemplatesjinja2

解决方案


解决方案相当简单。

{%- set app_srv = {} -%}
{%- set apps_list = [] -%}
{%- set owners_list = [] -%}

{%- for srv_chg in server_changes.results -%}
        {%- for srv_chg_item in srv_chg.Apps -%}
                {%- if srv_chg_item.AppNm not in apps_list -%}
                        {{ apps_list.append( srv_chg_item.AppNm ) }}
                {%- endif -%}
        {%- endfor -%}
{%- endfor -%}

{%- for apps_item in apps_list -%}
        {%- set owners_list = [] -%}
        {%- for srv_chg in server_changes.results -%}
                {%- for srv_chg_item in srv_chg.Apps -%}
                        {%- if srv_chg_item.owner not in owners_list and srv_chg_item.AppNm == apps_item -%}
                                {{ owners_list.append( srv_chg_item.owner ) }}
                        {%- endif -%}
                {%- endfor -%}
        {%- endfor -%}
        {{ app_srv.update({apps_item: {'owner': owners_list}}) }}
{%- endfor -%}

{{ app_srv|to_nice_json }}

在应用程序列表的 FOR 之后,我添加了一个 {%-set owner_list = [] -%}。
尝试在第一个结束前做同样的事情,但没有成功。


推荐阅读