使用$.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
相关产品推荐
相关产品推荐

