JSON在Jinja2模板中显示为unicode实体
我在使用 Jinja2 和 webapp2。
根据它的文档,Jinja2 会把所有的“上下文”数据编码成 unicode。这在我尝试把一个 json 字符串插入模板时遇到了问题:
jsonData = json.loads(get_the_file('catsJson.txt'))
我把 jsonData 传给模板,并且能够成功循环它,但当我把一个 json 元素插入到 HTML 中时,它看起来是这样的:
<option value='[u'dogs', u'cats']'>
我希望它看起来像这样(和原始的 json 字符串一样):
<option value='["dogs", "cats"]'>
有什么建议吗?
3 个回答
如果你在Jinja这边不需要对数组进行操作,只是想把数据传给JavaScript,我建议你使用:
json.dumps(python_object_or_array)
https://docs.python.org/2/library/json.html
这个字符串化的变量在传入Jinja时,可以直接传递给JavaScript,而不会带上Python特有的Unicode标记。而且,这样做还可以把True
和False
转换成JavaScript所期待的true
和false
。
在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>
在Jinja 2.9中,我按照@Xion的建议,先用map('string')
把可迭代的元素转换成字符串。然后,我把这个map过滤器的结果转换成一个列表,最后使用tojson
这个内置过滤器把它输出为JSON格式。
{{ jsonData|map('string')|list|tojson }}
你必须通过 safe
过滤器来处理这个值,这样才能告诉 jinja2 不要对输出应用其他过滤器。在 jinja2 的语法中,这样写:
{{ jsonData | safe }}
需要注意的是,因为你调用了 json.loads
,所以你实际上已经不再拥有 json 数据了,而是得到了一个 Python 列表对象。因此,当它被序列化时,就相当于调用 unicode(['dogs', 'cats'])
,这会给你一个 u
前缀。你可能不想真的解析 json 数据,或者你需要手动将列表转换成字符串,而不是让 jinja2 为你处理。