Flask向JavaScript传数据时出现Unexpected token {的JSON语法错误
解决Flask向JS传递JSON时的SyntaxError问题
嘿,这个问题我之前踩过坑!Uncaught SyntaxError: Unexpected token {这个错误几乎都是因为Flask传递的数据格式和你JS解析的方式不匹配导致的,我来给你捋捋常见的问题和解决办法:
1. 你可能重复解析了JS对象
很多新手会犯这个错:Flask传递的数据已经被渲染成合法的JavaScript对象了,你却还要用JSON.parse()去解析它,自然会报错。
举个反例:
Flask端代码
from flask import Flask, render_template app = Flask(__name__) @app.route('/') def index(): # 定义要传递的数据 my_data = {"username": "Kharak", "score": 99} return render_template('index.html', data=my_data)
错误的JS写法
// 这里会报错!因为{{ data }}渲染后是{username: "Kharak", score: 99},已经是JS对象 const data = JSON.parse('{{ data }}');
正确的写法
直接使用渲染后的对象,不需要JSON.parse():
const data = {{ data|tojson|safe }};
这里tojson是Flask自带的过滤器,会把Python对象转成合法的JSON字符串,safe过滤器告诉模板不要转义引号等特殊字符,这样渲染后就是一个直接可用的JS对象。
2. 通过AJAX请求传递数据时的错误
如果你是用AJAX(比如fetch/axios)从Flask接口拿数据,要确保Flask端用jsonify返回响应,而不是直接返回字符串:
Flask端正确写法
from flask import Flask, jsonify app = Flask(__name__) @app.route('/api/get-data') def get_data(): my_data = {"username": "Kharak", "score": 99} # 用jsonify返回,会自动设置正确的Content-Type头 return jsonify(my_data)
JS端正确写法
// 用fetch请求,response.json()会自动解析JSON,不用手动JSON.parse fetch('/api/get-data') .then(res => res.json()) .then(data => { console.log(data.username); // 输出Kharak }) .catch(err => console.error('请求出错:', err));
如果这里你非要手动用JSON.parse(),那得确保拿到的是纯字符串响应,但jsonify返回的已经是JSON格式,res.json()更省心。
3. 特殊字符未转义导致JSON格式损坏
如果你的数据里包含换行、单引号、双引号这类特殊字符,没有正确转义的话,会破坏JSON结构,导致JSON.parse()失败。
这种情况用tojson过滤器就可以解决,它会自动转义所有特殊字符:
const data = {{ my_data|tojson|safe }};
总结一下
最常见的问题就是把已经是JS对象的数据拿去用JSON.parse解析,或者传递的JSON字符串因为未转义特殊字符导致格式不合法。用Flask的tojson过滤器+safe,或者用jsonify配合AJAX的自动解析,基本就能解决这个问题。
内容的提问来源于stack exchange,提问作者Kharak




