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


当前回答

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

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

其他回答

问题很简单

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

你解析了两次。get使用dataType='json',因此数据已经是json格式。 使用美元。ajax({dataType: 'json'…具体设置返回的数据类型!

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

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

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

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

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

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

var parsed = JSON.parse(data);

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

var parsed = data;
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);

将因为缺少等待而抛出错误。实际返回的是Promise [object],而不是字符串。

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

var json_str = await returnJSONData();

这应该是非常明显的,但错误是在JSON上调用的。因此,如果您的await方法调用和JSON之间有一定的距离,则很容易错过。解析调用。