在 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']
方括号内的这些点不起作用,所以我无法访问可变位置的值?
想象一个简单的对象数组,如下所示。在模板中,我想设置一个变量来定义我想要到达的对象的路径,这样如果 path
是 somekey1
我得到 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
.
扩展它来进行索引访问
在 Jinja 中很容易从 JSON 数组中获取特定的变量对象,例如:
array['somekey']
但是如果我想访问嵌套列表中更深的值怎么办,例如:
array['somekey.subkey']
方括号内的这些点不起作用,所以我无法访问可变位置的值?
想象一个简单的对象数组,如下所示。在模板中,我想设置一个变量来定义我想要到达的对象的路径,这样如果 path
是 somekey1
我得到 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
.