应先检查 Content-Type,再用 .text() + try/catch + JSON.parse() 安全解析并清洗数据,对封装体需解包校验 code/data,配合兜底策略保障健壮性。

直接用 .json() 解析非标准 JSON 很容易报错,比如单引号、尾逗号、HTML 错误页、空响应,甚至响应体里混着调试信息。关键不是强行解析,而是先识别、再清洗、最后安全转换。
先看 Content-Type,再决定怎么读
不能一上来就调 response.json()。得结合响应头和实际内容做判断:
- 如果
Content-Type不是application/json(比如是text/html或text/plain),说明后端根本没打算返回 JSON,硬解析必崩,应改用.text() - 即使类型是 JSON,也可能是“伪 JSON”——比如 Django 调试模式下混入 HTML 片段,或 Nginx 返回的 502 错误页,这时也要先取文本再人工处理
- 对纯配置、日志类接口,直接
.text()更稳妥,避免因格式问题中断流程
用 .text() + try/catch + JSON.parse() 替代 .json()
.json() 是黑盒,出错就 throw;而 .text().then(str => JSON.parse(str)) 把字符串拿到手,你就能控制清洗逻辑:
- 去掉开头 BOM:
str.trim().replace(/^uFEFF/, '') - 简单修复常见写法:把单引号替换成双引号(仅限可信来源),或用正则提取
{.*}片段再解析 - 遇到换行符未转义的情况,可先
str.replace(/ /g, '\n').replace(/ /g, '\r')再 parse(需确认语义不变) - 示例写法:
const text = await response.text();
try {
const data = JSON.parse(text);
return data;
} catch (e) {
console.warn('JSON parse failed', text.slice(0, 200));
throw e;
}
处理“封装体”结构(如 { code: 0, data: {} })
很多 API 不返回裸数据,而是统一包装成带状态字段的结构。不能解析完就直接用 data.xxx:
立即学习“Java免费学习笔记(深入)”;
- 先确认
response.ok和状态码合理(如 200),再解析整个响应体 - 检查
code字段是否为成功值(如 0 或 1),data是否存在且为对象 - 若
code !== 0或!data,属于业务错误,应走错误提示逻辑,而非当作解析失败处理 - 访问嵌套字段时用可选链:
data?.items?.[0]?.user?.name,避免Cannot read property 'xxx' of undefined
错误状态码下的 JSON 响应也要解析
HTTP 状态码不是 200(比如 400、500)时,fetch 不会自动 reject,但后端常会在错误响应里返回 JSON 提示(如 { "appCode": 1020, "message": "Password too short" }):
- 别只在
success分支处理 JSON,catch或error回调里也要尝试.text()+JSON.parse() - jQuery 的
jqXHR.responseText、原生 fetch 的response.text()都能拿到原始响应体 - 注意:有些服务在错误时可能返回 HTML 或空字符串,解析前要加
if (text.trim())判断


















