我一直收到“Uncaught SyntaxError: Unexpected token o”错误信息。

309

我正在尝试学习一些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 (未找到)”,因此我知道它正在加载它(或者至少试图加载它)。


5
$.get可以识别发送的json,因此 var glacier = data; 应该就足够了。 - roselan
46
总结一下:你试图对其进行两次解析。 - fiatjaf
另请参见https://dev59.com/VmYq5IYBdhLWcg3wfwxx#42907459 - Pacerier
我遇到了类似的“Uncaught SyntaxError: Unexpected token I”,因为Python编码json.dumps([float('inf'),float('nan')]) == '[Infinity, NaN]' - Bob Stein
9个回答

319

看起来 jQuery 对数据类型进行了猜测。即使你没有调用 getJSON(),它仍会执行 JSON 解析,当你尝试在一个对象上调用 JSON.parse() 时,就会出现错误。

更多解释请见Aditya Mittal 的回答


13
啊哈,那么data[0].english返回的是“bag”。看起来我根本不需要解析json文件。 - Bjorninn
2
很有趣...我猜jQuery会猜测数据类型并假设它是JSON。那么我想getJSON也能用,对吧? - ek_ny
87
小提示:如果您对一个对象使用 JSON.parse,则会抛出“Unexpected token o”,这是因为它试图解析 obj_to_parse.toString(),它的值为 [object Object]。尝试使用 JSON.parse('[object Object]'); ;) - Pier Paolo Ramon
22
我也遇到过类似的情况,我认为我的错误在于尝试将一个已经是 JSON 对象的内容解析成 JSON。 - Wak
2
jQuery不会猜测。如果您没有使用dataType进行覆盖(为什么要这样做),它将使用响应的Content-type HTTP标头来确定数据类型,并在它是jQuery识别的类型之一时对其进行解析。 - Quentin
显示剩余5条评论

77

问题非常简单

jQuery.get('wokab.json', function(data) {
    var glacier = JSON.parse(data);
});
你对它进行了两次解析。 get 使用 dataType='json',因此数据已经是 JSON 格式的。 使用 $.ajax({ dataType: 'json' ... 明确设置返回的数据类型!

55

基本上,如果响应头是text/html,则需要进行解析,如果响应头是application/json,则已经为您解析。

用于text/html响应的jquery成功处理程序中的解析数据:

var parsed = JSON.parse(data);

从jQuery成功处理程序中解析了application/json响应的数据:

var parsed = data;

6
请注意,给这个回答投反对票的人,上面被接受的答案包含了与此答案完全相同的内容。现在添加来自被接受的答案的链接。 - Geoffrey Hale

13

关于“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”错误的答案。因此可能有助于其他遇到该问题的人。


3

简单地说,响应已经被解析了,您不需要再次解析它。如果您再次解析它,将会返回"unexpected token o"。但是您必须在请求中指定数据类型为 dataType='json'


2

我刚遇到了类似的问题,我的解决方案可能会有所帮助。我使用iframe上传和转换xml文件为json并在幕后发送回来,在Chrome中,有时候会向传入的数据添加一些垃圾数据,这只会间歇性地显示出来,并导致“Uncaught SyntaxError: Unexpected token o”错误。

我是这样访问iframe数据的:

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

这份代码在本地运行正常,但上传到服务器后,只有部分文件以特定顺序加载时出现问题。虽然我不知道具体原因,但以下修改解决了问题,我将上一行代码改成:

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

我曾经注意到HTML响应中有一些垃圾信息。

简而言之,请检查原始的HTML响应数据,你可能会发现一些问题。


好的,谢谢。奇怪的是,有时似乎会接收到已解析的JSON对象,有时则不会。我还没有时间继续该项目,所以我不知道它是否会随机出现这种情况(取决于浏览器和系统之类的东西)。谢谢指点,我会牢记在心。 - Bjorninn

2
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

修复方法很简单,只需按照规定添加await即可:

最初的回答

var json_str = await returnJSONData();

这应该很明显,但错误是在JSON.parse上调用的,所以如果您的await方法调用和JSON.parse调用之间有一些“距离”,那么很容易忽略。"最初的回答"

0

确保您的JSON文件在前后没有任何尾随字符。也许有不可打印的字符?您可以尝试以下方法:

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

1
JSON.parse('[{"english":"bag","kana":"kaban","kanji":"K"},{"english":"glasses","kana":"megane","kanji":"M"}]'); 运行正常。你尝试将该行替换为alert(data)以检查文件是否正确加载了吗? - thexebolud

-1
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 - Stack Overflow”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接