正则无法可靠校验JSON合法性,因其不支持嵌套结构解析、引号配对、转义及Unicode处理;应使用JSON.parse()配合try...catch捕获SyntaxError来准确判断。

直接用正则完整、可靠地校验 JSON 字符串的合法性,在工程实践中不推荐,也不可行。JSON 语法具有嵌套性、递归性和上下文敏感性(比如引号配对、转义规则、对象/数组层级),而正则表达式(尤其 JS 中的 RegExp)不具备解析嵌套结构的能力。试图用单个正则覆盖所有合法/非法 JSON 情况,极易漏判或误判,甚至引发严重安全或稳定性问题。
为什么正则不适合校验 JSON 格式
JSON 允许任意深度的嵌套对象和数组,例如:{"a":[{"b":null},{"c":[1,2,{"d":"e"}]}]}。正则无法动态计数括号/花括号的匹配层数;字符串中允许含转义字符("\n"、""")、Unicode("u4f60"),这些需按 JSON 规则逐字符解析;单引号、尾随逗号、undefined、NaN、注释等 JavaScript 扩展写法在标准 JSON 中非法,但正则难以精准区分语境。
正确做法:用内置 JSON.parse() + 异常捕获
这是唯一符合标准、健壮且浏览器/Node.js 全平台兼容的方式:
- 调用
JSON.parse(str)尝试解析 - 用
try...catch捕获SyntaxError - 成功解析即表示格式合法(且是有效 JSON 值)
示例:
立即学习“Java免费学习笔记(深入)”;
function isValidJSON(str) {
if (typeof str !== 'string') return false;
try {
JSON.parse(str);
return true;
} catch (e) {
return e instanceof SyntaxError;
}
}
若必须预筛(非替代 parse),可配合极简正则初检
仅用于快速过滤明显非法输入(如空值、纯空格、不以 { 或 [ 开头),不保证 JSON 合法性:
-
/^s*[{[]/—— 排除不以{或[开头的字符串 -
/S/—— 确保至少含一个非空白字符 - 注意:不能检查结尾是否匹配、引号是否闭合、转义是否正确
这类正则只是性能优化手段,绝不可跳过 JSON.parse()。
需要额外校验业务语义?放在 parse 后处理
例如“必须是对象”、“字段 name 必须是字符串”、“items 数组长度不能超 100”——这些属于业务逻辑,应在 JSON.parse() 成功后,用 JavaScript 对解析出的值做类型和内容判断,而非塞进正则里。










