JSON清洗需分四步:先验content-type并检查字符串起始符;再清除BOM、JSONP外壳、Markdown包裹等非法字符;接着用try/catch容错解析并递归过滤null/空字符串;最后主动剥离$开头等无用元字段。

后端返回的 JSON 经常不规范,直接 JSON.parse() 会报错。清洗不是“修语法”,而是分层拦截、预处理、再解析——核心是先保命,再提纯。
第一步:检查响应类型,避免 HTML 错误页混入
很多 500/404 响应返回的是 HTML 页面,但前端仍当作 JSON 处理。必须在解析前验证:
- 检查
response.headers.get('content-type')是否包含application/json - 若不匹配,直接拒收或降级处理(如记录日志、返回空对象)
- 哪怕 content-type 正确,也建议用
response.text()获取原始字符串,再判断是否以{或[开头
第二步:清除常见非法字符和外壳
真实接口常返回带前缀、BOM、控制符或 Markdown 包裹的内容:
- BOM(
\uFEFF)或首尾空白:用jsonString.trim().replace(/^\uFEFF/, '') - JSONP 格式(如
callback({...})):用正则jsonString.replace(/^[\w$]+\s*\(\s*([\s\S]*)\s*\)\s*;?$/, '$1')提取内部 JSON - Markdown 代码块包裹(
{...}):用jsonString.match(/```json\s*([\s\S]*?)\s*```/)?.[1]提取 - 单引号替代双引号、末尾逗号、无引号键名:这类不能靠
JSON.parse解决,需用json5(前端可用 json5.js)或正则修复
第三步:容错解析 + 值级清洗
即使字符串格式合法,内容也可能含 null、空字符串、冗余字段或循环引用。建议组合使用:
- 用
try/catch包裹JSON.parse(),失败时提供默认值或上报错误 - 对成功解析的对象,递归过滤无效值:
value === null || value === ''的键直接跳过 - 需同时剔除因此产生的空对象(如
{})?推荐两阶段:
①JSON.stringify(obj, (k, v) => v === null || v === '' ? undefined : v)
② 再用JSON.parse(..., (k, v) => typeof v === 'object' && v !== null && Object.keys(v).length === 0 ? undefined : v)
第四步:特殊字段主动剥离
某些后端返回的元数据字段(如 $id、$values、__typename)对业务无用,可统一移除:
- 写一个递归函数,遍历所有层级,遇到指定 key 就
delete obj[key] - 也可在 replacer 中统一忽略:
(k, v) => ['\$id', '\$values', '__typename'].includes(k) ? undefined : v - 注意:避免在 reviver 中修改原对象结构(如 delete),容易引发不可预测行为
清洗不是越全越好,关键是根据接口稳定性选择策略:高频变动接口建议多层兜底;内部服务可聚焦字段级清理。不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











