Response.json() 是 Response 构造函数的语法糖,自动序列化数据并设置 Content-Type: application/json;传入不可序列化值会抛 TypeError,错误用法包括双重序列化或误调实例方法。

Response.json() 是静态方法,不能直接构造自定义 Response 对象
很多人看到 Response.json() 就以为它像 JSON.stringify() 那样只负责序列化数据,其实它本质是 Response 构造函数的语法糖:内部调用 new Response(body, options),并自动设置 Content-Type: application/json。它不“构造裸对象”,而是返回一个完整的、可被 fetch() 消费的 Response 实例。
正确用法:传入可序列化数据 + 可选配置项
你只需提供要转成 JSON 的数据(如对象、数组),它会自动 JSON.stringify() 并封装为 Response;第二个参数可覆盖默认 headers 或 status:
-
Response.json({ ok: true, data: [] })→ status 200,Content-Type: application/json -
Response.json({ error: "not found" }, { status: 404 })→ status 404,header 不变 -
Response.json(data, { headers: { "X-Trace": "abc" } })→ 合并默认 header 和自定义 header
注意:如果传入不可序列化的值(如 function、undefined、循环引用对象),会抛出 TypeError: Converting circular structure to JSON 或类似错误。
和 new Response(JSON.stringify(...), ...) 的关键区别
手动构造时容易漏掉 header 或写错格式,而 Response.json() 省去两处易错点:
立即学习“前端免费学习笔记(深入)”;
- 不用自己调
JSON.stringify()—— 它内部处理,且对undefined、function等值会直接报错,比静默丢弃更安全 - 自动设
Content-Type: application/json; charset=utf-8—— 手动写常有人漏掉charset=utf-8,导致中文乱码或后端解析异常 - status 默认为 200 —— 手动用
new Response()时若不显式设status,也是 200,这点一致
常见误用场景与修复
典型错误包括试图“先生成 JSON 字符串再喂给 Response.json()”,或者混淆了静态方法和实例方法:
- ❌
Response.json(JSON.stringify(obj))→ 会双重序列化,结果变成"{\"a\":1}"(字符串里的字符串) - ❌
new Response().json(obj)→json()不是实例方法,会报TypeError: Response.json is not a function - ❌ 在非模块环境(如普通 script 标签)中调用却没检查浏览器支持 ——
Response.json()是较新 API,Chrome 110+、Firefox 115+ 支持,旧版本需降级为手动构造
真正需要定制 body 序列化逻辑(比如用 flatted 处理循环引用)时,就别用 Response.json(),老实用 new Response(JSON.stringify(...), ...) 自己控场。



















