必须先用 JSON.parse() 严格校验合法性,再针对常见错误轻量预处理;禁用强行修复,慎用第三方库;线上需保留原始字符串并明确报错。

前端验证和修复不规范 JSON,核心思路是:先用 JSON.parse() 严格校验是否合法;对非法字符串,再按常见错误类型做针对性预处理。不能跳过校验直接“强行修复”,否则可能掩盖数据问题或引入新错误。
用 JSON.parse() 做可靠验证
这是唯一推荐的验证方式,浏览器和 Node.js 原生支持,完全遵循 ECMA-404 标准:
- 必须先判断输入是否为字符串,否则
null、undefined、对象等传入会绕过解析,误判为“合法” - 捕获
SyntaxError即可判定非法,其他异常(如内存溢出)极少发生,一般无需单独处理 - 空字符串、纯空白、
"null"、"true"、"false"、数字字符串等,只要格式正确,都算合法 JSON
常见不规范格式及轻量修复策略
仅在明确知道数据来源“基本接近标准”且业务允许容错时,才考虑修复。以下修复需按顺序尝试,避免叠加副作用:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- 单引号 → 双引号:用正则
.replace(/'([^']*)'/g, '"$1"'),但注意避开字符串内部的单引号(如"it's"),简单场景可用,复杂嵌套慎用 - 键名无引号 → 补双引号:匹配形如
name:的模式,替换为"name":,需确保不误伤值中的冒号(如 URL) - 尾逗号清理:用
.replace(/,\s*(?=([}\]])/g, '')删除对象或数组末尾的逗号,不碰中间逗号 - 去除行首行尾不可见字符:用
.trim().replace(/[\u200B-\u200F\uFEFF]/g, '')清掉零宽空格等隐藏符号
谨慎使用第三方修复库
像 json5 或 relaxed-json 这类库能解析更宽松的语法(支持单引号、注释、尾逗号等),但它们不是 JSON 解析器,而是“类 JSON”解析器:
立即学习“Java免费学习笔记(深入)”;
- 它们返回的是 JavaScript 对象,不是标准 JSON;若后续要
JSON.stringify()回传给后端,可能因数据类型(如undefined、NaN)引发新问题 - 仅适合内部调试或日志解析等非生产交互场景;对外 API 数据交换必须回归标准 JSON
- 引入额外包会增大包体积,简单项目建议优先用原生 + 小修预处理
线上调试与兜底建议
真实环境中,不规范 JSON 往往来自用户粘贴、旧系统导出或接口异常响应:
- 在
catch块中打印原始字符串(console.log('Raw input:', str)),比只看报错信息更容易定位问题位置 - 结合浏览器 Network 面板查看原始响应体,确认是前端拼接错误,还是后端返回了 HTML 错误页(如 500 页面)被当成了 JSON
- 永远保留原始字符串备份,修复失败时返回
null或抛出自定义错误,不要静默返回空对象,避免下游逻辑误判

















