为什么 JSON.parse 在有效的 JSON 上失败(隐藏的 Unicode 字符)
Source: Dev.to
问题:JSON.parse 抛出 “Unexpected token”
有时即使 JSON 看起来完全合法,JSON.parse 仍会抛出 “Unexpected token” 错误。当 JSON 来自 Slack、Word、Notion 或 ChatGPT 等来源时,这种情况尤其令人困惑。
const json = '{ "name": "John" }';
字符串表面上是正确的,但可能隐藏了 Unicode 字符。
常见的隐形字符
- 零宽空格 –
U+200B - 字节顺序标记 (BOM) –
U+FEFF - 不间断空格 –
U+00A0
这些字符在大多数编辑器中不可见,却会导致严格的解析器出错。
带有隐藏字符的示例
{ "name": "John" }
引号前的那个极小的不可见字符可能导致类似以下的错误:
Unexpected token in JSON at position X
检测并移除隐藏字符
可以使用正则表达式剥离常见的隐藏字符:
const clean = str.replace(/[\u200B-\u200D\uFEFF]/g, "");
在剥离之前,记录字符代码以确认它们的存在会很有帮助。
用于检测的浏览器工具
在调试此问题时,我制作了一个小型浏览器工具,用来检测并移除不可见的 Unicode 字符。它会高亮显示:
- 零宽空格
- BOM
- 不间断空格
- 其他隐藏的 Unicode 字符
你可以在此尝试:
该工具 100 % 在客户端运行,文本永远不会离开你的浏览器。
JSON.parse 失败时的处理办法
- 检查隐藏的 Unicode 字符 – 检查字符串中是否存在不可见的码点。
- 记录字符代码 – 遍历字符串并输出
charCodeAt的值。 - 剥离零宽字符 – 使用上面的正则表达式或类似方法。
不可见字符是导致解析错误的一个出乎意料的常见原因。移除它们即可恢复 JSON.parse 的正常行为。