应先校验再解析JSON,用try-catch仅捕获SyntaxError并记录错误详情、返回默认值;预检查字符串非空、首尾括号匹配及最小长度,避免解析异常中断流程。

离线缓存中 JSON 恢复时遇到损坏字符串(如截断、编码错误、非法字符),直接 JSON.parse() 会抛出 SyntaxError,导致整个恢复流程中断。核心思路是:**先校验再解析,失败时降级处理,不阻断后续逻辑**。
用 try-catch 包裹 parse 并捕获具体异常
这是最基本也是最关键的防护。不能假设缓存内容一定合法,必须主动捕获解析异常:
- 只捕获
SyntaxError,避免吞掉其他逻辑错误(如 ReferenceError) - 在 catch 块中记录错误详情(如原始字符串前 50 字符、存储 key),便于调试
- 返回默认值(如
null或空对象)而非让上层崩溃
预检查字符串有效性(轻量级过滤)
在 parse 前快速排除明显非法情况,减少无谓的解析开销:
- 检查是否为非空字符串:
typeof data === 'string' && data.trim() - 粗略判断是否以
{或[开头、以}或]结尾(注意去除首尾空白) - 检查长度是否过小(如
data.length )或过大(防内存溢出)
提供安全解析封装函数
把上述逻辑收敛成一个可复用工具函数,统一处理策略:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
function safeParseJSON(str, defaultValue = null) {
if (typeof str !== 'string' || !str.trim()) return defaultValue;
try {
const parsed = JSON.parse(str.trim());
// 可选:进一步校验结构(如要求是对象且含特定字段)
return parsed;
} catch (e) {
if (e instanceof SyntaxError) {
console.warn('Invalid JSON in cache:', str.slice(0, 50) + '...');
return defaultValue;
}
throw e; // 其他错误不吞,继续上抛
}
}
结合缓存策略做自动修复或清理
对反复失败的 key,可主动清理或标记失效:
- 解析失败后调用
localStorage.removeItem(key)防止下次再试 - 记录失败次数,超过阈值(如 3 次)则清空该 key 并通知用户“本地数据已重置”
- 若使用 IndexedDB,可在事务中捕获错误并 abort,避免脏数据写入
不复杂但容易忽略——关键不是避免损坏,而是让损坏不传导为功能故障。

















