You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中JSON.parse处理:生效与失效场景的原理是什么?

为什么JSON.parse处理含�的内容会有两种结果?

这个问题的核心在于JSON规范的语法约束,以及JavaScript字符串和JSON字符串的规则差异。下面我拆解清楚两种场景的技术原理:

1. 能正常解析的场景:�被转义为\u0000

当JSON字符串中的空字符(U+0000)是以Unicode转义序列\u0000的形式存在时,JSON.parse可以正常解析。

技术原理

根据ECMA-404(JSON官方规范),JSON字符串允许使用\uXXXX格式的转义序列来表示任意Unicode字符,包括控制字符(比如U+0000)。JavaScript引擎的JSON.parse实现严格遵循这一规范,遇到\u0000时会正确解码为原生的�字符。

举个实际例子:

// 合法的JSON:空字符被转义为\u0000
const validJson = '{"content": "Hello\\u0000World"}';
const result = JSON.parse(validJson);

// 验证解析结果:字符串中确实包含空字符
console.log(result.content.includes('\0')); // 输出 true

2. 无法解析的场景:直接包含未转义的�

如果JSON字符串中直接嵌入了原生的�字符(未经过转义),JSON.parse会立即抛出SyntaxError。

技术原理

JSON规范明确规定:JSON字符串不能包含未转义的控制字符(U+0000至U+001F范围内的字符,仅允许制表符\t、换行\n、回车\r这三个例外)。

这里要注意一个容易混淆的点:JavaScript本身的字符串允许直接包含�(比如let str = 'a�b'是合法的),但JSON是独立的数据格式,它的语法规则比JavaScript字符串更严格。当你把一个包含原生�的JS字符串当作JSON来解析时,就会违反JSON规范,触发语法错误。

例子如下:

// 非法的JSON:直接包含未转义的空字符
const invalidJson = '{"content": "Hello' + '\0' + 'World"}';

try {
  JSON.parse(invalidJson);
} catch (error) {
  console.error(error); // 抛出 SyntaxError: Unexpected token in JSON at position X
}

总结

两种情况的本质区别就是该空字符是否符合JSON规范的要求:

  • 转义为\u0000:符合规范,解析正常
  • 原生未转义�:违反规范,解析失败

内容的提问来源于stack exchange,提问作者Confused

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:26:09