JSON在Jinja2模板中显示为unicode实体

14 投票
3 回答
25665 浏览
提问于 2025-04-17 09:26

我在使用 Jinja2 和 webapp2。

根据它的文档,Jinja2 会把所有的“上下文”数据编码成 unicode。这在我尝试把一个 json 字符串插入模板时遇到了问题:

jsonData = json.loads(get_the_file('catsJson.txt'))

我把 jsonData 传给模板,并且能够成功循环它,但当我把一个 json 元素插入到 HTML 中时,它看起来是这样的:

<option value='[u&#39;dogs&#39;, u&#39;cats&#39;]'>

我希望它看起来像这样(和原始的 json 字符串一样):

<option value='["dogs", "cats"]'>

有什么建议吗?

3 个回答

0

如果你在Jinja这边不需要对数组进行操作,只是想把数据传给JavaScript,我建议你使用:

json.dumps(python_object_or_array)

https://docs.python.org/2/library/json.html

这个字符串化的变量在传入Jinja时,可以直接传递给JavaScript,而不会带上Python特有的Unicode标记。而且,这样做还可以把TrueFalse转换成JavaScript所期待的truefalse

在Flask的上下文中,它的写法大概是这样的:

@app.route('/')
def home():
     if userNeedsToLogin():
          session['routePath'] = request.full_path
          return render_template('login.html', error=None)
     else:
          return render_home()

def render_home():
     print "Rendering Home"
     results = get_some_database_query_results()
     data_out = json.dumps(results)
     return render_template('home.html', data=data_out)

home.html

<!DOCTYPE HTML>
<html>
<head>
  <!-- import javascript function processData -->
</head>
<body>
  <!-- page of stuff -->
  <script>
     processData( {{ data|safe }} );
  </script>
</body>
</html>
1

在Jinja 2.9中,我按照@Xion的建议,先用map('string')把可迭代的元素转换成字符串。然后,我把这个map过滤器的结果转换成一个列表,最后使用tojson这个内置过滤器把它输出为JSON格式。

{{ jsonData|map('string')|list|tojson }} 
22

你必须通过 safe 过滤器来处理这个值,这样才能告诉 jinja2 不要对输出应用其他过滤器。在 jinja2 的语法中,这样写:

{{ jsonData | safe }}

需要注意的是,因为你调用了 json.loads,所以你实际上已经不再拥有 json 数据了,而是得到了一个 Python 列表对象。因此,当它被序列化时,就相当于调用 unicode(['dogs', 'cats']),这会给你一个 u 前缀。你可能不想真的解析 json 数据,或者你需要手动将列表转换成字符串,而不是让 jinja2 为你处理。

撰写回答