json解析需容错处理:先用正则粗筛再try-catch精判,清洗缺失字段、统一类型、清除非法字符,并递归清理嵌套结构中的控制符与异常值。

JSON 在数据清洗中常因来源不规范而出现字段缺失、类型错误、非法字符或嵌套结构混乱等问题。直接用 JSON.parse() 会抛错,必须先做容错处理再清洗和格式化。
识别并跳过非法 JSON 字符串
不是所有输入都是合法 JSON,比如多值顶层({a:1}{b:2})、单引号键名、尾部逗号、注释等。应先用正则粗筛 + try-catch 精判:
- 用
/^\s*[\{\[].*[\}\]]\s*$/s初步匹配是否像 JSON(避免空字符串或纯文本) - 包裹
try { JSON.parse(str) } catch(e) { return null },返回null或默认空对象表示清洗失败 - 对批量数据,建议加日志记录失败原始字符串和错误类型,便于溯源
补全缺失字段并统一类型
清洗核心是让结构可预测。例如 API 返回的用户数据可能缺 phone 或 age 字段,或 age 是字符串 "25":
- 定义 schema 模板(如
{ name: "", age: 0, phone: null, tags: [] }) - 用
Object.assign(schema, parsed)合并,再手动校验:若user.age不是数字,转为parseInt(user.age) || 0 - 对数组字段(如
tags),确保是数组:Array.isArray(user.tags) ? user.tags : [user.tags].filter(Boolean)
清理非法字符与嵌套异常
常见问题包括:字段值含控制字符(\u0000)、HTML 实体(&)、深层嵌套循环引用(虽 JSON 本身不支持,但解析前可能混入 JS 对象)、或字段名含空格/特殊符号:
- 递归遍历对象,对字符串值执行
.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/g, '')清除不可见控制符 - 用
DOMPurify.sanitize()或简单正则.replace(/&/g, '&').replace(/, ' 处理常见 HTML 实体(按需) - 对嵌套过深(如
user.profile.address.city.name链超过 5 层),可截断或扁平化:flatten(obj, prefix = '') → { 'profile_address_city': 'Beijing' }
标准化输出:格式化 + 去重 + 时间对齐
清洗后输出需一致可读。例如时间字段可能是 "2024-03-15"、1710489600000 或 "15 Mar 2024":
- 统一时间字段为 ISO 8601 字符串:
new Date(input).toISOString().split('T')[0](日期)或完整带时分秒 - 用
JSON.stringify(cleanedObj, null, 2)格式化输出,便于人工检查;生产环境可用JSON.stringify(cleanedObj)压缩 - 对数组类字段(如日志列表),可去重:
[...new Set(logs.map(j => JSON.stringify(j)))].map(JSON.parse)
不复杂但容易忽略:清洗脚本要留出“原始字段快照”(如 _raw_json)和“清洗状态标记”(如 _clean_status: "success" | "partial" | "failed"),方便后续审计和回溯。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











