
本文介绍如何在 JavaScript 中安全、可靠地掩码 JSON 字符串中的指定字段值——推荐采用 JSON.parse 的 reviver 参数或 JSON.stringify 的 replacer 函数,避免直接操作字符串带来的转义风险与解析错误。
本文介绍如何在 javascript 中安全、可靠地掩码 json 字符串中的指定字段值——推荐采用 `json.parse` 的 reviver 参数或 `json.stringify` 的 replacer 函数,避免直接操作字符串带来的转义风险与解析错误。
在处理敏感数据(如账号、ID、状态码)时,常需对 JSON 中特定字段的值进行脱敏掩码。初学者易陷入“用正则直接替换 JSON 字符串”的误区——这不仅因引号、嵌套、转义等问题极易出错,更存在 JSON 结构被意外破坏、字段误匹配(如 key 名部分重合)、无法处理数字/布尔等非字符串类型等严重缺陷。
✅ 正确做法:利用 JSON 原生解析与序列化机制
JavaScript 提供了语义安全的 JSON 处理能力:JSON.parse() 支持 reviver 回调函数,在解析过程中逐层访问每个键值对;JSON.stringify() 支持 replacer 函数,在序列化时动态修改输出值。二者结合,可精准、健壮、类型安全地完成字段掩码。
✅ 推荐方案一:使用 JSON.parse + reviver(解析时掩码)
const fieldsToMask = ['TextID', 'AccountNum', 'ReturnCode'];
const jsonString = `[{"ReturnCode":0,"TextID":"nwComputedSubTotal","AccountNum":"958375845","Status":"SomeStatus"}]`;
const maskedReviver = (key, value) => {
if (fieldsToMask.includes(key)) {
const strValue = String(value); // 统一转为字符串,兼容数字、布尔等类型
const len = strValue.length;
return len <= 3 ? '***' : strValue.slice(0, 2) + '*'.repeat(len - 2);
}
return value;
};
const parsed = JSON.parse(jsonString, maskedReviver);
const maskedJsonString = JSON.stringify(parsed);
console.log(maskedJsonString);
// 输出:[{"ReturnCode":"***","TextID":"nw****************","AccountNum":"95*******","Status":"SomeStatus"}]✅ 推荐方案二:使用 JSON.stringify + replacer(序列化时掩码)
适用于已解析为对象/数组的场景(如服务端中间件处理后对象):
const arr = JSON.parse(jsonString); // 先解析为 JS 对象
const maskedReplacer = (key, value) => {
if (fieldsToMask.includes(key)) {
const strValue = String(value);
const len = strValue.length;
return len <= 3 ? '***' : strValue.slice(0, 2).padEnd(len, '*');
}
return value;
};
const maskedJsonString = JSON.stringify(arr, maskedReplacer, 2); // 第三参数为缩进,便于调试
console.log(maskedJsonString);? 关键细节说明
- String(value) 确保所有类型(数字 0、布尔 true、null)均被安全转换为字符串再处理;
- slice(0, 2) + '*'.repeat(len - 2) 明确实现“前2位保留+其余掩码”,比 padEnd(len, '*') 更直观可控;
- reviver 在解析阶段生效,replacer 在序列化阶段生效——二者互斥使用,无需同时调用;
- fieldsToMask.includes(key) 严格匹配属性名(区分大小写),不会误伤子字段或相似键名。
⚠️ 为什么不推荐正则表达式?
原始代码中 new RegExp("\"" + field + ":" + "\"" + "(.*?)", "g") 存在多重隐患:
- 未转义 JSON 中可能存在的双引号、反斜杠,导致正则语法错误或匹配越界;
- .*? 是贪婪匹配,可能跨字段捕获(如 "AccountNum":"123","TextID":"abc" 中误匹配到逗号后内容);
- 无法识别值类型("ReturnCode":0 是数字,无引号,正则根本匹配不到);
- 修改字符串而非结构,破坏 JSON 有效性风险极高。
✅ 总结
- 永远优先解析 JSON → 操作 JS 对象 → 再序列化,这是处理 JSON 的黄金法则;
- reviver 和 replacer 是标准、高效、零依赖的掩码方案;
- 掩码逻辑应统一处理类型转换与边界条件(空值、短字符串),确保健壮性;
- 避免字符串级正则操作 JSON——它不是文本,而是结构化数据。
此方法已在 Node.js 与现代浏览器中广泛验证,兼顾安全性、可维护性与性能,是生产环境的最佳实践。


















