Django中通过AJAX传递列表变量时JSON解析报错问题
解决Django视图与AJAX间JSON解析错误的问题
看起来你遇到的核心问题是模板变量的HTML转义和JSON格式不规范导致的解析失败,我来一步步帮你理清并解决:
问题根源
当你把Python列表x = ['Braselton', 'Buford']传到Django模板后,模板会自动对特殊字符(比如单引号)进行HTML转义,把'变成'。如果直接把这个转义后的字符串通过AJAX传回后端,拿到的就是['Braselton', 'Buford']——这既不是合法的JSON(JSON要求用双引号包裹字符串),还混有HTML实体,自然会触发JSONDecodeError。
正确的解决步骤
1. 在模板中安全地将Python列表转为JS数组
推荐使用Django内置的json_script模板标签,它会自动处理转义问题,同时避免XSS风险:
<!-- 在你的模板中添加这行 --> {{ x|json_script:"x-data" }}
然后在JS中获取这个数组:
// 从模板中读取并解析成JS数组 const xArray = JSON.parse(document.getElementById('x-data').textContent);
如果你不想用json_script,也可以手动关闭转义(但注意如果列表包含用户输入内容,有XSS风险):
<script> const xArray = {{ x|safe }}; </script>
2. AJAX请求时正确传递数据
在AJAX中,把JS数组序列化为标准JSON字符串再传递:
// 示例用jQuery的AJAX,原生JS同理 $.ajax({ url: '/your-view-url/', method: 'GET', data: { // 把数组转成JSON字符串 x: JSON.stringify(xArray) }, success: function(response) { console.log('Success:', response); } });
3. 后端视图正确解析数据
现在后端拿到的是标准JSON字符串,直接用json.loads解析即可:
import json from django.http import HttpResponse def your_view(request): if request.method == 'GET': x_str = request.GET.get('x') try: new_x = json.loads(x_str) print(new_x) # 输出: ['Braselton', 'Buford'] return HttpResponse('解析成功') except json.JSONDecodeError as e: print(f"解析错误: {e}") return HttpResponse('解析失败', status=400)
额外说明
- 为什么之前的字符串无法解析?因为转义后的
'是HTML实体,不是JSON认可的引号,而且JSON要求字符串必须用双引号,而你原来的列表转成字符串后是单引号,这两个问题叠加导致了解析失败。 - 优先使用
json_script,它是Django官方推荐的安全方式,能避免手动处理转义带来的各种问题。
内容的提问来源于stack exchange,提问作者jay queue
相关产品推荐
相关产品推荐

