You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理Jinja2 JSON模板中include引入文件的换行转义问题

问题根源

之前尝试的{% include path | replace("\n", " ") %}写法不生效,核心原因是Jinja2标签内的过滤器默认作用于紧邻的变量,这里的replace实际处理的是path变量存储的文件路径字符串,而非include渲染完成后的文件内容,替换逻辑根本没有命中脚本里的换行符。
同时JSON字符串不允许直接出现未转义的控制字符(包括换行、制表符等),仅替换换行如果遇到脚本内存在双引号、反斜杠等其他JSON特殊字符,依然会触发解析错误。

可行解决方案

方案1:块级过滤器替换换行(无需修改Python渲染代码)

使用Jinja2原生的{% filter %}块标签将include标签包裹起来,过滤器会直接作用于块内所有内容渲染后的最终结果,替换换行即可。
修改template.j2内容如下:

{
   "multi": "{% filter replace('\n', '\\n') %}{% include './multi_line.sh' %}{% endfilter %}"
}
  • 如果需要将多行命令拼成无换行的单行命令,把替换目标从'\\n'改成' '即可
  • 该方案仅处理换行符,如果脚本内包含双引号、反斜杠、制表符等特殊字符,依然可能导致JSON解析失败,适合脚本内容完全可控的简单场景

方案2:自定义JSON转义过滤器(生产环境推荐,100%兼容JSON规范)

通过Python侧自定义Jinja2过滤器,直接借助标准库json模块的转义能力处理字符串,可覆盖所有JSON特殊字符的转义场景,不会出现格式问题。

  1. 修改template_renderer.py,注册自定义过滤器:
from jinja2 import Environment, FileSystemLoader
import json

# 自定义JSON字符串转义过滤器
def to_json_str(s: str) -> str:
    # json.dumps会自动处理所有特殊字符转义,切片去掉首尾包裹的双引号(模板内已手动加引号)
    return json.dumps(s)[1:-1]

with open("./variables.json") as variables_file:
    variables_json = json.load(variables_file)

loader = FileSystemLoader("./")
env = Environment(loader=loader)
# 注册过滤器到Jinja2环境
env.filters["to_json_str"] = to_json_str
template = env.get_template("./template.j2")
rendered_template = template.render(variables_json)
json_output = json.loads(rendered_template)

print(json.dumps(json_output, indent=2))
  1. 修改template.j2,用filter块包裹include标签调用自定义过滤器:
{
   "multi": "{% filter to_json_str %}{% include './multi_line.sh' %}{% endfilter %}"
}

如果需要同时把换行替换为空格拼成单行命令,可以链式调用过滤器:

{
   "multi": "{% filter replace('\n', ' ') | to_json_str %}{% include './multi_line.sh' %}{% endfilter %}"
}

运行渲染代码后可得到完全合法的JSON输出,示例结果:

{
  "multi": "echo 'hello';\necho 'world!';"
}

内容的提问来源于stack exchange,提问作者NSGoat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 07:27:19