位置:首页 > 行业软件 > 解决Safari解析特殊JSON数据报语法错误的方法

解决Safari解析特殊JSON数据报语法错误的方法

时间:2026-06-05  |  作者:318050  |  阅读:0

很多时候,你在Safari里用JSON.parse()解析一段JSON字符串。它看起来完全正常。结果却直接报了个SyntaxError: Unexpected token

别急着怀疑数据。问题很可能出在Safari对JSON标准执行得比Chrome或Firefox更严苛上。它不允许任何偏离RFC 8259规范的写法,哪怕只是一个尾随逗号、单引号或者注释。

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

第一步,先确认错误是否真的来自JSON语法本身。打开Safari开发者工具(Cmd+Opt+I),在Console里直接跑一行最基础的JSON.parse('{"name":"Alice"}')

如果连这行都报错,说明当前页面可能被某些旧版polyfill或调试工具污染了全局的JSON对象。先别急着往下查,刷新一个无扩展的无痕窗口再试。

如果基础解析正常,那错误就来自你传入的数据源。这时候别直接钻进代码改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,搜索ja vascript.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解析,但能在接口临时故障时维持基础功能。

来源:整理自互联网
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多