json.parse() 无容错机制,需通过严格校验、正确转义、try-catch捕获及降级处理来防止崩溃;后端应使用标准序列化方法,前端禁用字符串拼接构造json;预清洗仅限无法改造源头的非标输入,验证前置可提升效率但不能替代parse。

JSON.parse() 本身不提供容错机制,遇到语法错误会直接抛出异常。防止崩溃的关键不是“让 parse 不报错”,而是**提前校验、正确转义、捕获异常并降级处理**。
确保原始字符串符合 JSON 标准
JSON 规范严格:字符串必须用双引号包裹,内部双引号、反斜杠、换行符等必须转义。常见非法写法如:{"msg": "line1
line2"}(未转义
)或 {"text": "he said "hello""}(缺少 ")。这类字符串根本不是合法 JSON,parse 必然失败。
- 后端生成 JSON 时应使用标准序列化方法(如 Python 的
json.dumps()、Java 的Gson.toJson()、JS 的JSON.stringify()),它们自动处理所有转义 - 前端拼接字符串构造 JSON 是高危操作,应绝对避免;必须动态插入内容时,先 stringify 再嵌入,例如:
const msg = "he said "hello""; const jsonStr = `{"message": ${JSON.stringify(msg)}}`;
用 try-catch 主动捕获并处理错误
这是最基础也最有效的防线。不要假设输入一定合法,尤其面对接口响应、localStorage 数据或用户粘贴内容。
- 始终将
JSON.parse()包裹在try...catch中 - 捕获后可返回默认值、记录错误日志、提示用户或触发重试逻辑
- 示例:
let data; try { data = JSON.parse(raw); } catch (e) { console.warn("JSON 解析失败", e.message, raw); data = { error: true }; }
对非标准输入做预清洗(谨慎使用)
仅当明确知道数据来源不规范(如旧系统返回类 JSON 字符串、日志文本提取片段),且无法改造源头时,才考虑轻量清洗。切勿盲目 replace 所有引号或反斜杠。
- 简单修复常见双引号缺失:用正则补全未转义的内部双引号(需结合上下文判断,不可通用)
- 换行符处理:JSON 中换行必须写成
,若原始字符串含真实 字符(非转义序列),需先用.replace(/ /g, '\n')预处理 - 更安全的做法是用成熟库如
json5(支持单引号、注释、不转义换行等),但需确认业务允许偏离标准 JSON
验证后再解析,而非依赖 parse 报错
对于关键字段,可在 parse 前做简易结构检查,减少无效解析调用。
- 检查首尾是否为
{和}或[和] - 用
raw.trim().startsWith('{') && raw.trim().endsWith('}')快速过滤明显非法字符串 - 注意:这些检查不能替代 parse,只是前置过滤,最终仍需 try-catch
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











