Python通过Jinja2模板渲染输出标准JSON格式的实现方法
Jinja2渲染输出标准JSON的实现方案
核心思路是按照JSON的语法结构重写模板,通过Jinja2内置循环变量控制分隔符,避免出现语法错误,不需要修改原有Python渲染的核心逻辑,仅调整模板即可,可选增加转义配置提升鲁棒性。
1. 修改模板文件test.j2
直接替换原有模板内容为以下写法:
[ {%- for item in final_lst %} { "sr": {{ item.service_role | tojson }}, "fip": {{ item.first_ip | tojson }} }{% if not loop.last %},{% endif %} {%- endfor %} ]
模板写法说明
- 外层直接包裹JSON数组的方括号
[],内部通过循环生成每个对象元素 - 利用Jinja2循环内置的
loop.last变量判断是否为最后一个元素,仅在非最后一个元素后添加逗号,彻底避免尾逗号导致的JSON解析失败 - 使用
|tojson过滤器处理字段值:该过滤器会自动为字符串值添加双引号、转义值内部的双引号、换行符等特殊字符,相比手动给变量套双引号的写法,不会因为字段值包含特殊字符生成无效JSON,鲁棒性更强 - 精准使用
{%- -%}空白控制标记,既消除了Jinja2语法块产生的多余空行,又保留了JSON的标准缩进格式,可读性不受影响
2. (可选)环境配置优化
如果业务场景中字段值可能包含大量特殊字符,可以在初始化Jinja2环境时显式配置转义规则,进一步降低格式错误概率,修改Python侧的Environment初始化代码即可:
from jinja2 import Environment, FileSystemLoader env = Environment( loader=FileSystemLoader('templates'), autoescape=False # 已使用tojson过滤器,关闭全局自动转义避免重复转义 ) int_template = env.get_template('test.j2') out = int_template.render(final_lst=final_lst) print(out)
3. 输出验证
运行代码后将直接输出符合要求的标准JSON结构,和预期结果完全一致:
[ { "sr": "do_not_use", "fip": "10.7.17.1" }, { "sr": "role_a", "fip": "10.7.17.10" }, { "sr": "role_a", "fip": "10.7.17.56" } ]
常见踩坑提示
- 不要给所有Jinja2语法块都加
-%}结尾,过度压缩空白会导致JSON结构挤在一起,甚至把不同元素的键值对拼到同一行破坏语法 - 不要手动给变量套双引号后直接输出,一旦字段值里包含双引号、反斜杠等JSON特殊字符,生成的内容会直接解析失败
- 不要在循环里给最后一个元素后面加逗号,部分严格的JSON解析器会直接抛出语法错误
内容的提问来源于stack exchange,提问作者netv
相关产品推荐
相关产品推荐

