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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:58:03