Jinja2渲染含混合引号的JSON值后解析报错如何解决?
问题根因
你遇到的报错本质是Jinja2默认输出Python字典对象时,使用的是Python原生的字符串表示格式,字典键用单引号包裹,转义逻辑也是Python语法规范,不符合JSON/YAML的语法要求,当字符串值同时包含单双引号时就会出现解析失败的问题。
修复方案
场景1:需要输出可被JSON解析的内容
直接使用Jinja2内置的tojson过滤器,会自动将Python对象序列化为标准JSON格式字符串,自动处理引号转义、双引号键的要求。
修复后代码示例:
import json from jinja2 import Environment j = json.loads('{"k": "\\"v1\\"=\'v2\'"}') # 模板中添加tojson过滤器 t = Environment().from_string('{{ d | tojson }}') r = t.render({'d': j}) # 此时r为标准JSON字符串,可直接解析 y = json.loads(r)
如果需要格式化输出,可传缩进参数:{{ d | tojson(indent=2) }}。
场景2:需要输出可被YAML解析的内容
给Jinja2自定义一个toyaml过滤器,调用YAML序列化方法生成标准YAML格式字符串。
修复后代码示例:
import yaml from jinja2 import Environment # 自定义YAML序列化过滤器 def toyaml(data): return yaml.safe_dump(data) env = Environment() env.filters['toyaml'] = toyaml j = yaml.safe_load('{"k": "\\"v1\\"=\'v2\'"}') t = env.from_string('{{ d | toyaml }}') r = t.render({'d': j}) # 此时r为标准YAML字符串,可直接解析 y = yaml.safe_load(r)
注意事项
不要直接将Python原生对象输出到需要后续结构化解析的文本位置,必须先通过对应格式的序列化方法转换为标准格式字符串,避免Python特有的语法规则导致解析失败。
内容的提问来源于stack exchange,提问作者Nelson G.
相关产品推荐
相关产品推荐

