如何使用Jinja2将静态项附加到dict

问题描述 投票:1回答:2

如果我有一个如下列表:

[
    {
        "a": "1",
        "b": "2"
    },
    {
        "a": "3",
        "b": "4"
    },
    {
        "a": "5",
        "b": "6"
    }            
]

如何重命名第一个列表的键并使用Jinja2过滤器将静态项附加到每个dict?

例如:

[
    {
        "a2": "1",
        "b2": "2",
        "c2": "test"
    },
    {
        "a2": "3",
        "b2": "4",
        "c2": "test"
    },
    {
        "a2": "5",
        "b2": "6"
        "c2": "test"
    }            
]

我尝试过类似以下的内容:

{{ my_list | map('json_query', '{a2:a, b2:b}') | list }}

这是一半的战斗,但我如何将静态项目附加到最终的dict?

python python-3.x ansible jinja2
2个回答
1
投票

以下应该做:

- debug:
  msg: >-
    {{ my_list | json_query("[].{a2: a, b2: b, c2: 'test' }") }}

结果粘贴您的数据:

    "msg": [
        {
            "a2": "1",
            "b2": "2",
            "c2": "test"
        },
        {
            "a2": "3",
            "b2": "4",
            "c2": "test"
        },
        {
            "a2": "5",
            "b2": "6",
            "c2": "test"
        }
    ]
}

单引号和双引号嵌套的顺序很重要(参见jmespath specification)。如果你将单/双引号放在arround的另一边,你的静态字符串的结果将是"None"


0
投票

我将定义一个负责修改字典的全局python函数。它看起来像:

def some_func(my_sequence):
    new_sequence = []
    for my_dict in my_sequence:
        new_dict = {f"{key}2": value for key, value in my_dict.items()}
        new_dict.update(c2="test")
        new_sequence.append(new_dict)
    return new_sequence

当然可以改进以去除硬编码。

一旦定义了Jinja2环境,我就会声明一个指向该函数的自定义过滤器。

environment.filters["my_customfilter"] = some_func

并将其用于模板中,如下所示:

{{ my_list|my_customfilter() }}

或者进入一个循环:

{% for my_dict in my_list|my_customfilter() %}
    {# do something here #}
{% endfor %}

或任何其他用途。

这样主要的逻辑不是由Jinja2带来的,它只是一个模板引擎,而是由你的主要python脚本。在进化的情况下,您的代码更灵活。

© www.soinside.com 2019 - 2024. All rights reserved.