我一直得到“Uncaught SyntaxError: Unexpected token o”;

我试图学习一些html/css/javascript,所以我正在写自己的教学项目。

这个想法是在json文件中包含一些词汇表,然后将其加载到一个表中。我设法加载了文件并打印了其中一个值,之后我开始编写代码将这些值加载到表中。

在这样做之后,我开始得到一个错误,所以我删除了我写的所有代码,只留下一行(与之前工作的同一行)…只有错误还在。

错误如下:

Uncaught SyntaxError: Unexpected token o
(anonymous function)script.js:10
jQuery.Callbacks.firejquery-1.7.js:1064
jQuery.Callbacks.self.fireWithjquery-1.7.js:1182
donejquery-1.7.js:7454
jQuery.ajaxTransport.send.callback

我的javascript代码包含在一个单独的文件,只是这样:

function loadPageIntoDiv(){
document.getElementById("wokabWeeks").style.display = "block";
}


function loadWokab(){
//also tried getJSON which threw the same error
jQuery.get('wokab.json', function(data) {
var glacier = JSON.parse(data);
});
}

和我的JSON文件只有以下现在:

[
{
"english": "bag",
"kana": "kaban",
"kanji": "K"
},


{
"english": "glasses",
"kana": "megane",
"kanji": "M"
}
]

现在错误报告在第11行,即var glacier = JSON.parse(data);行。

当我删除json文件时,我得到错误:“get http://.../wokab.json 404(未找到)”,所以我知道它正在加载它(或至少试图)。

430940 次浏览

看起来jQuery对数据类型进行了猜测。即使您没有调用getJSON(),它也会进行JSON解析——然后当您试图对对象调用JSON.parse()时,您将得到错误。

进一步的解释可以在阿蒂亚•米塔尔的回答是中找到。

我刚才也遇到了类似的问题,我的解决办法可能会有帮助。我使用iframe上传并将xml文件转换为json,并将其发送回后台,Chrome向传入的数据添加了一些垃圾,这些数据只会间歇性地显示,并导致“Uncaught SyntaxError: Unexpected token o”错误。

我像这样访问iframe数据:

$('#load-file-iframe').contents().text()

它在localhost上工作得很好,但当我将其上传到服务器时,它只在某些文件上停止工作,并且仅在以特定顺序加载文件时才停止工作。我不知道是什么引起的,但这个解决了问题。我把上面的行改成

$('#load-file-iframe').contents().find('body').text()

有一次我注意到HTML响应中有一些垃圾。

长话短说,检查您的原始HTML响应数据,您可能会发现一些东西。

确保JSON文件前后没有任何尾随字符。也许是不能打印的?你可能想试试这种方法:

[{"english":"bag","kana":"kaban","kanji":"K"},{"english":"glasses","kana":"megane","kanji":"M"}]

问题很简单

jQuery.get('wokab.json', function(data) {
var glacier = JSON.parse(data);
});

你解析了两次。get使用了dataType='json',因此data是json格式的已经。 使用$.ajax({ dataType: 'json' ...专门设置返回的数据类型!< / p >

简单地说,响应已经解析了,您不需要再次解析它。如果你再次解析它,它会给你“意外的令牌o”,但是你必须在请求中指定数据类型为dataType='json'类型

基本上,如果响应头是text/html,你需要解析,如果响应头是application/json,它已经为你解析了。

解析数据从jquery成功处理文本/html响应:

var parsed = JSON.parse(data);

解析数据从jquery成功处理程序的应用程序/json响应:

var parsed = data;
Unexpected token错误的另一个提示。 javascript对象和json之间有两个主要区别:

  1. Json数据必须始终使用双引号。
  2. 密钥必须引用

正确的JSON

 {
"english": "bag",
"kana": "kaban",
"kanji": "K"
}

错误JSON 1

 {
'english': 'bag',
'kana': 'kaban',
'kanji': 'K'
}

错误JSON 2

 {
english: "bag",
kana: "kaban",
kanji: "K"
}

备注

这不是对那个问题的直接回答。但它是Unexpected token错误的答案。因此,它可能会帮助其他遇到这个问题的人。

SyntaxError: Unexpected token o in JSON

当你忘记为返回JSON数据的方法使用await关键字时,也会发生这种情况。

例如:

async function returnJSONData()
{
return "{\"prop\": 2}";
}


var json_str = returnJSONData();
var json_obj = JSON.parse(json_str);

将抛出一个错误,因为缺少await。实际返回的是Promise [object],而不是string

要修复,只需添加等待,因为你应该:

var json_str = await returnJSONData();

这应该是很明显的,但是错误是在JSON.parse上调用的,所以如果在你的await方法调用和JSON.parse调用之间有一些距离,很容易忽略。

const getCircularReplacer = () => {
const seen = new WeakSet();
return (key, value) => {
if (typeof value === "object" && value !== null) {
if (seen.has(value)) {
return;
}
seen.add(value);
}
return value;
};
};
JSON.stringify(tempActivity, getCircularReplacer());

其中tempActivity是fething数据,产生错误“SyntaxError:意外令牌o在JSON在位置1 -堆栈溢出”