我正在尝试学习一些 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(未找到)”所以我知道它正在加载它(或至少尝试加载它)。
var glacier = data;
应该足够了。
Uncaught SyntaxError: Unexpected token I
,因为 Python 编码了 json.dumps([float('inf'),float('nan')]) == '[Infinity, NaN]'
看起来 jQuery 对数据类型进行了猜测。即使您没有调用 getJSON(),它也会执行 JSON 解析——然后当您尝试在对象上调用 JSON.parse() 时,您会收到错误消息。
进一步的解释可以在 Aditya Mittal's answer 中找到。
问题很简单
jQuery.get('wokab.json', function(data) {
var glacier = JSON.parse(data);
});
您正在解析它两次。 get
使用 dataType='json'
,因此数据已经为 json 格式。使用 $.ajax({ dataType: 'json' ...
专门设置返回的数据类型!
基本上如果响应头是 text/html 你需要解析,如果响应头是 application/json 它已经为你解析了。
从 jquery 成功处理程序中解析数据以获取 text/html 响应:
var parsed = JSON.parse(data);
来自 jquery 成功处理程序的解析数据,用于应用程序/json 响应:
var parsed = data;
Unexpected token
错误的另一个提示。 javascript 对象和 json 之间有两个主要区别:
json 数据必须始终用双引号引起来。必须引用键
正确的 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
错误的答案。因此,它可能会帮助其他遇到这个问题的人。
只需响应已经解析,您无需再次解析它。如果您再次解析它,它会给您“意外的令牌 o”,但是您必须在请求中指定数据类型为 dataType='json'
类型
我刚才遇到了类似的问题,我的解决方案可能会有所帮助。我正在使用 iframe 上传 xml 文件并将其转换为 json 并将其发送回幕后,Chrome 正在向传入数据添加一些垃圾,这些垃圾只会间歇性显示并导致“Uncaught SyntaxError: Unexpected token o”错误。
我正在访问这样的 iframe 数据:
$('#load-file-iframe').contents().text()
它在本地主机上运行良好,但是当我将它上传到服务器时,它只停止处理某些文件,并且仅在以特定顺序加载文件时才停止。我真的不知道是什么原因造成的,但这解决了它。我将上面的行更改为
$('#load-file-iframe').contents().find('body').text()
一旦我注意到 HTML 响应中有一些垃圾。
长话短说,检查您的原始 HTML 响应数据,您可能会发现一些问题。
SyntaxError: Unexpected token o in JSON
当您忘记将 await
关键字用于返回 JSON 数据的方法时,也会发生这种情况。
例如:
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
调用之间存在一些距离,很容易错过。
确保您的 JSON 文件之前或之后没有任何尾随字符。也许是无法打印的?您可能想尝试这种方式:
[{"english":"bag","kana":"kaban","kanji":"K"},{"english":"glasses","kana":"megane","kanji":"M"}]
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 正在对产生错误“SyntaxError: Unexpected token o in JSON at position 1 - VoidCC
JSON.parse
一个对象,则抛出“Unexpected token o”仅仅是因为它试图解析obj_to_parse.toString()
,即[object Object]
。尝试JSON.parse('[object Object]');
;)dataType
覆盖它(为什么会这样),它会使用响应的Content-type
HTTP 标头来确定它是什么类型的数据,并在它是 jQuery 识别的数据时对其进行解析。