如果我有一个如下列表:
[
{
"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?
以下应该做:
- 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"
我将定义一个负责修改字典的全局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脚本。在进化的情况下,您的代码更灵活。