首页
首页> 软件教程> 如何解决Safari浏览器解析特殊格式JSON数据遇到语法解析错误的问题

如何解决Safari浏览器解析特殊格式JSON数据遇到语法解析错误的问题

作者:佚名时间:2026-06-05 08:17:52

Safari解析JSON报SyntaxError主因是其严格遵循RFC 8259标准,拒绝尾随逗号、单引号、BOM、零宽字符等非法格式;需先验证原始响应、清洗字符串、再解析。

当你在Safari浏览器中调用JSON.parse()解析一段看似正常的JSON字符串却报出SyntaxError: Unexpected token时,问题往往不是数据本身“错”,而是Safari对JSON标准的执行比Chrome或Firefox更严格——它拒绝解析任何不符合RFC 8259规范的变体,哪怕只是一个尾随逗号、单引号或注释。

确认错误是否真由JSON语法引起

打开开发者工具(Cmd+Opt+I),在Console中粘贴并运行:JSON.parse('{"name":"Alice"}')。如果这行基础代码都报错,说明当前页面已加载了破坏全局JSON对象的脚本(如某些旧版polyfill或调试工具),【必须先刷新无扩展的无痕窗口重试】

若基础解析正常,则错误确实来自你传入的数据源——此时不要直接跳进代码改JSON.parse调用,先验证原始字符串。

用Safari原生方式提取并检查原始响应体

在Network标签页中找到对应请求 → 点击 → 切换到Response选项卡 → 点击右上角“Copy response”按钮。

新建一个空白HTML文件,写入以下内容并用Safari打开:

重点观察:末尾是否有未闭合的[{;开头是否混入了BOM();是否存在不可见的零宽空格(U+200B)——Safari会把它们当作非法token。

修复三类Safari特敏感的非法格式

方法一:删除尾随逗号(最常见)
{"items":[{ "id":1, }, { "id":2, }]}改成{"items":[{ "id":1 }, { "id":2 }]}。Safari不接受数组或对象末尾的逗号,即使ES2015允许,JSON标准也不允许。

方法二:强制转义所有双引号和反斜杠
若JSON来自用户输入或后端模板拼接,用正则预处理:jsonString.replace(/(["])/g, '$1')。不这样做会导致Safari在遇到未转义的"n时立即中断解析。

方法三:剥离BOM和控制字符
在fetch回调中插入清洗步骤:
response.text().then(text => {
  return text.replace(/^uFEFF/, '').replace(/[u0000-u0008u000Bu000Cu000E-u001Fu007F-u009F]/g, '');
).then(cleanText => JSON.parse(cleanText))【此步必须在JSON.parse之前执行,否则Safari直接抛错】

绕过解析失败的兜底方案

第一步:捕获原始错误信息
try {
  const data = JSON.parse(jsonString);
} catch (e) {
  console.error("Safari解析失败详情:", e.name, e.message, "位置:", e?.column ?? "未知");
}

第二步:启用宽松解析(仅限开发调试)
在Safari地址栏输入about:config → 搜索javascript.options.strict → 设为false(注意:该设置重启后失效,且不解决生产环境问题)。

第三步:用正则安全提取关键字段(应急用)
例如只取idnameconst match = jsonString.match(/"id"s*:s*(d+).*?"name"s*:s*"([^"]*)"/s); if (match) { console.log({id: +match[1], name: match[2]}); }。这不能替代JSON解析,但能让你在接口临时故障时维持基础功能。

相关阅读

热门文章

人气下载推荐