在 Jinja2 中使用括号内的点来达到可变深度 JSON,如 ['object.subobject']?

Use of dots inside brackets to reach variable depth JSON in Jinja2 like ['object.subobject']?

在 Jinja 中很容易从 JSON 数组中获取特定的变量对象,例如:

array['somekey']

但是如果我想访问嵌套列表中更深的值怎么办,例如:

array['somekey.subkey']

方括号内的这些点不起作用,所以我无法访问可变位置的值?

想象一个简单的对象数组,如下所示。在模板中,我想设置一个变量来定义我想要到达的对象的路径,这样如果 pathsomekey1 我得到 somevalue1 但如果路径是 somekey3.subkey2 我得到 subvalue2 喜欢:

python代码

path = 'somekey3.subkey2'

jinja模板代码

{{ array[path] }}

预期结果:

subvalue2

实际结果:

no result (nothing gets printed on the screen)

完整 json 数组:

[{
    "somekey1": "somevalue1"
}, {
    "somekey2": "somevalue2"
}, {
    "somekey3": {
        "subkey1": "subvalue1",
        "subkey2": "subvalue2"
    }
}]

提前致谢!

正如我的评论所说,您可能需要一个自定义过滤器来进行点访问——幸运的是它并不难实现:

import jinja2


@jinja2.pass_environment
def dot(env: jinja2.Environment, obj, path):
    for key in path.split("."):
        obj = env.getattr(obj, key)  # use same semantics as jinja's own getattr
    return obj


env = jinja2.Environment()

env.filters["dot"] = dot

tpl = env.from_string("""
{{ obj | dot('somekey3.subkey2') }}
""".strip())

print(tpl.render(obj={
    "somekey3": {
        "subkey1": "subvalue1",
        "subkey2": "subvalue2"
    }
}))

输出是预期的 subvalue2

您可以通过明智地使用 isdigit.

扩展它来进行索引访问