安全解析JSON需确保字符串合法且不执行代码:用JSON.stringify()序列化、try-catch封装JSON.parse()预检,禁用单引号/注释/undefined等非标语法,UTF-8编码下emoji等Unicode字符自动正确处理。

JavaScript 中安全解析含特殊字符的 JSON 字符串,核心是确保字符串本身是合法 JSON 格式,且不执行任意代码。JSON 标准本身不允许未转义的控制字符、换行符、单引号、裸反斜杠等——这些不是“JSON 特殊字符”,而是非法字符。真正需要处理的是:如何让含用户输入(如换行、引号、emoji、Unicode 符号)的文本,在序列化时合法、反序列化时不失真。
确保原始字符串已正确转义再生成 JSON
问题常出在服务端或前端拼接 JSON 字符串(如 "{name: '" + userInput + "'}"),这极易破坏结构。正确做法是始终用 JSON.stringify() 处理值:
- 后端返回前,对所有字段调用标准 JSON 序列化(如 Node.js 的
res.json()或 Python 的json.dumps()) - 前端若需动态构造,不要字符串拼接,改用对象组装后整体序列化:
const data = { name: userInput, message: "Hello 世界?" };<br>const jsonStr = JSON.stringify(data); // 自动转义换行、emoji、双引号等
解析前校验字符串是否为有效 JSON
JSON.parse() 遇非法格式直接抛错,但可封装一层做预检,避免未捕获异常中断逻辑:
- 用
try...catch包裹解析,并区分语法错误与业务错误 - 简单校验可先检查首尾是否为
{}或[],但不可替代实际解析(如"{}"合法,"{a:1}"不合法) - 示例安全解析函数:
function safeParse(jsonStr) {<br> try {<br> return JSON.parse(jsonStr);<br> } catch (e) {<br> if (e instanceof SyntaxError) {<br> console.warn("Invalid JSON:", e.message);<br> return null;<br> }<br> throw e;<br> }<br>}
警惕非标准 JSON 扩展(如单引号、注释、undefined)
浏览器原生 JSON.parse() 只支持标准 JSON(RFC 8259)。以下写法均会报错:
立即学习“Java免费学习笔记(深入)”;
-
{'name': 'Alice'}— 单引号不合法,必须用双引号 -
{"name": "Alice" /* comment */}— JSON 不支持注释 -
{"count": undefined}—undefined不是 JSON 值类型(只支持null,number,string,boolean,array,object) - 若必须兼容此类格式,需用第三方解析器(如
json5),但应明确这是非标行为,不推荐用于 API 通信
处理 Unicode 和 emoji 等多字节字符
UTF-8 编码的 JSON 原生支持 emoji、中文、数学符号等,无需额外处理,但要注意:
- 确保传输过程编码一致(HTTP 响应头应含
Content-Type: application/json; charset=utf-8) - Node.js 环境中读取文件时指定
utf8编码:fs.readFileSync('data.json', 'utf8') - JSON 字符串中 emoji 会被自动转为 Unicode 转义(如
"?"→"\ud83d\ude0a"),但JSON.parse()会还原为真实字符,无需手动解码


















