Flask jsonify返回JSON后客户端JSON.parse报错求助
嘿,我来帮你捋捋这个JSON解析的问题!你遇到的这几个报错,本质上都是前端处理响应时的小误区,咱们一个个拆解清楚:
为什么会出现Unexpected token o或解析字符报错?
这俩错误其实是同一个原因:你在解析一个已经被浏览器自动转成JavaScript对象的内容!
当你用Flask的flask.jsonify()返回数据时,它会自动给响应加上Content-Type: application/json的HTTP头。浏览器看到这个头后,会直接把响应体解析成JS对象,而不是保留原始的JSON字符串。这时候如果你再调用JSON.parse()去处理它,相当于先把对象转成字符串(结果是[object Object]),再去解析这个不符合JSON格式的字符串——自然会在第1位的o字符处报错。
为什么会出现“每个字符逐行打印”的情况?
这说明你错误地把原始的JSON字符串当成了可迭代对象去遍历(比如用for...of循环),而没有先把它解析成JS对象。比如你拿到了"{\"key\":\"value\"}"这样的字符串,直接遍历的话,就会把每个字符(包括引号、大括号)挨个输出。
正确的处理方式
根据你用的前端请求方式,选对应的方法:
1. 用fetch API的正确写法
fetch('/你的接口路径') .then(response => response.json()) // 这里已经完成JSON解析,直接拿到JS对象 .then(data => { console.log(data.myobject); // 直接使用解析后的对象属性 }) .catch(err => console.error('请求出错:', err));
2. 用XMLHttpRequest的正确写法
const xhr = new XMLHttpRequest(); xhr.open('GET', '/你的接口路径'); xhr.responseType = 'json'; // 告诉浏览器自动解析JSON为对象 xhr.onload = function() { if (xhr.status === 200) { console.log(xhr.response.myobject); // 直接使用对象 } }; xhr.send();
如果没设置responseType,也可以手动解析字符串,但要确保拿到的是原始响应文本:
xhr.onload = function() { if (xhr.status === 200) { const data = JSON.parse(xhr.responseText); // 这里才需要parse,因为拿到的是字符串 console.log(data.myobject); } };
快速排查小技巧
不确定拿到的是字符串还是对象?先打印类型确认:
console.log(typeof 你拿到的响应数据);
如果输出是object,直接用就行;如果是string,再调用JSON.parse()。
内容的提问来源于stack exchange,提问作者proximacentauri
相关产品推荐
相关产品推荐

