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

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)

额外说明

  • 为什么之前的字符串无法解析?因为转义后的&#39;是HTML实体,不是JSON认可的引号,而且JSON要求字符串必须用双引号,而你原来的列表转成字符串后是单引号,这两个问题叠加导致了解析失败。
  • 优先使用json_script,它是Django官方推荐的安全方式,能避免手动处理转义带来的各种问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:57:28