Response.json() 是 Fetch API 中解析响应体为 JSON 的方法,返回 Promise,成功时得 JS 对象/数组,失败时自动 reject;但不检查 HTTP 状态码或网络错误,需配合 try/catch 和 response.ok 判断才能安全使用。

Response.json() 是 Fetch API 中专门用于解析响应体为 JSON 格式数据的方法,它返回一个 Promise,成功时解析出 JavaScript 对象或数组,失败时自动 reject 错误(比如非 JSON 内容、格式错误等)。关键在于:它不自动检查 HTTP 状态码,也不处理网络失败,需配合 try/catch 和状态判断才能真正“快速又安全”地解析。
正确调用 Response.json() 的基本流程
不能直接对 fetch 返回的 Response 对象调用 .json() 后就假设数据可用。必须确保:
- 请求已成功发出且收到响应(即 fetch Promise 已 resolve)
- 响应状态码表示成功(如 200–299),否则
response.json()仍会执行,但业务上可能不该继续 - 响应体实际是合法 JSON(服务端返回了正确的 Content-Type 和有效 JSON 字符串)
必须捕获的三类常见异常
1. 网络错误(fetch 失败):DNS 失败、连接中断、跨域拒绝等,此时 fetch 返回的 Promise 直接 reject,response.json() 根本不会执行。
2. HTTP 错误状态(如 404、500):fetch 仍 resolve,但 response.ok 为 false,需手动检查,否则可能把错误页 HTML 当 JSON 解析而报错。
3. JSON 解析失败:响应体不是合法 JSON(如空字符串、XML、HTML 错误页、乱码),response.json() 的 Promise 会 reject。
推荐的健壮写法(含完整异常处理)
以下是一个生产环境可用的封装示例:
async function safeJsonFetch(url) {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
return data;
} catch (err) {
if (err.name === 'TypeError' && err.message.includes('failed to fetch')) {
console.error('网络请求失败,请检查网络或服务地址');
} else if (err.name === 'SyntaxError') {
console.error('响应内容不是合法 JSON,可能是服务端返回了错误页面');
} else {
console.error('请求处理异常:', err.message);
}
throw err;
}
}
小技巧:避免重复解析与提前校验
Response 对象的 body 只能读取一次,response.json() 调用后不可再调用 response.text() 或再次 .json()。如需调试原始响应内容,可先用 response.clone().json();若想提前确认是否为 JSON,可检查 response.headers.get('content-type') 是否包含 application/json,但这只是提示,不能替代实际解析。











