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

使用$.getJSON获取JSON时偶现Unexpected token u解析错误求助

解决AJAX异步时序导致的JSON解析错误

兄弟,这个问题我太懂了!你遇到的是异步操作的时序坑,咱们先把错误根源搞清楚:

那个Uncaught SyntaxError: Unexpected token u其实是个典型信号——你在尝试解析undefined!因为当JSON.parse()接收到undefined时,它会把这个值当成字符串"undefined"来解析,第一个字符就是u,直接触发语法错误。

为什么会出现这个问题?

你的代码逻辑里有个致命的时序问题:$.getJSON是异步请求,它不会阻塞后续代码执行。你把请求对象jqxhr存起来后,就等着window.onload触发去取responseText——但AJAX请求的完成时间是不确定的!

  • 大部分时候,请求速度快,在window.onload之前就拿到了响应,所以能正常解析;
  • 但偶尔(10次里1次)请求会因为网络延迟、服务器响应慢等原因,在window.onload触发后才完成,这时候jqxhr.responseText还是undefined,一解析就炸了,直接导致页面空白。

怎么解决?直接跟着改就行!

方案1:用回调/Promise确保数据返回后再处理(最推荐)

既然AJAX是异步的,咱们就把所有依赖JSON数据的逻辑,放到请求成功的回调里,或者用Promise的then方法:

// 用jQuery的方式监听window加载完成,再发起请求
$(window).on('load', function() {
  $.getJSON("main.json")
    .then(function(data) {
      // jQuery已经帮你把响应解析成JSON对象了,直接用data就行!
      const json = data;
      // 所有依赖json的逻辑都放到这里
      ....
    })
    .catch(function(error) {
      // 一定要加错误处理!就算请求失败,也能给用户个提示,不会页面空白
      console.error('加载JSON失败:', error);
      // 比如在这里显示一个错误提示框:
      // document.body.innerHTML = '<p>数据加载失败,请刷新重试</p>';
    });
});

方案2:应急方案(保留原有结构但修复时序)

如果你不想大改代码结构,可以先检查请求状态,确保请求完成后再处理:

var jqxhr = $.getJSON("main.json");
var json;
window.onload = function() {
  // 先判断请求是否已经成功完成
  if (jqxhr.state() === "resolved") {
    // 直接用jQuery解析好的responseJSON,不用自己parse
    json = jqxhr.responseJSON;
    ....
  } else {
    // 请求还没完成或者失败了,监听完成事件
    jqxhr.done(function(data) {
      json = data;
      ....
    }).fail(function(error) {
      console.error('请求失败:', error);
      // 处理错误,避免页面空白
    });
  }
};

额外提醒

  • 别再手动用JSON.parse(jqxhr.responseText)了!$.getJSON已经自动帮你把合法的JSON响应解析成对象了,直接用data或者responseJSON就行,多此一举反而容易出问题。
  • 错误处理真的很重要!就算请求10次里9次成功,那1次失败也会让用户看到空白页,加个catch或者fail,至少能给用户一个友好提示。

内容的提问来源于stack exchange,提问作者Mathias Rød

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:10:10