我不断收到“ Uncaught SyntaxError:意外令牌o”


306

我正在尝试学习一些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 2011年

46
总结:您正在尝试将其解析两次。
fiatjaf


我得到类似的信息Uncaught SyntaxError: Unexpected token I是因为Python编码json.dumps([float('inf'),float('nan')]) == '[Infinity, NaN]'
Bob Stein

Answers:


314

看起来jQuery对数据类型有所猜测。即使您没有调用getJSON(),它也会进行JSON解析-然后,当您尝试在对象上调用JSON.parse()时,就会收到错误消息。

进一步的解释可以在Aditya Mittal的答案中找到


13
啊哈,所以data [0] .english返回“ bag”。看起来我根本不需要解析json文件。
Bjorninn 2011年

1
很有意思。我猜jquery对数据类型进行了猜测,并假设它是json。我认为getJson也会同样起作用,对吗?
ek_ny 2011年

87
小提示:如果您JSON.parse是一个对象,则抛出“意外令牌o”仅是因为它试图解析obj_to_parse.toString(),即[object Object]。尝试JSON.parse('[object Object]');;)
Pier Paolo Ramon 2012年

22
它也发生在我身上,我认为我的错误是我试图将已经是JSON对象的内容解析为JSON
Wak

2
jQuery不会猜测。如果您不使用它重写它dataType(为什么会这样),它会使用Content-type响应的HTTP标头来确定它是哪种数据,并在jQuery识别出该数据时对其进行解析。
Quentin

76

问题很简单

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

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


54

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

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

var parsed = JSON.parse(data);

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

var parsed = data;

6
请注意任何对此不赞成的人,上面接受的答案包含该答案的确切副本。现在从接受的答案中添加链接。
杰弗里·黑尔

11

另一个提示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错误的答案。因此,对这个问题之以鼻的其他人可能会有所帮助。


2

只是响应已经被解析,您不需要再次解析它。如果再次解析它,它将给您“意外的令牌o”,但是您必须在请求中指定数据类型为typedataType='json'


1

刚才我遇到了类似的问题,我的解决方案可能会有所帮助。我正在使用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对象,有时却没有。我没有时间继续该项目,所以我不知道它是否会随机执行(取决于浏览器和系统等)。感谢您的指导,我会牢记这一点。
Bjorninn 2011年

1
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();

这应该很明显,但是会调用on JSON.parse,因此如果您的方法调用与调用之间存在一定距离,则很容易错过。awaitJSON.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 2011年

0
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:位置1的JSON中的意外令牌o-堆栈溢出”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.