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

时间:2011-11-10 15:11:25

标签: javascript jquery json

我正在尝试学习一些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(Not Found)”所以我知道它正在加载它(或者至少尝试)。

9 个答案:

答案 0 :(得分:311)

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

可以在Aditya Mittal's answer中找到进一步的解释。

答案 1 :(得分:76)

问题非常简单

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

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

答案 2 :(得分:51)

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

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

var parsed = JSON.parse(data);

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

var parsed = data;

答案 3 :(得分:10)

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

  1. json数据必须始终用双引号引用。
  2. 必须引用
  3. 更正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错误的答案。所以它可能会帮助其他人解决这个问题。

答案 4 :(得分:2)

只需解析响应,您无需再次解析它。如果你再次解析它会给你“意外的令牌o”但是你必须在你的请求中指定数据类型dataType='json'

答案 5 :(得分:1)

我刚才有类似的问题,我的解决方案可能有所帮助。我正在使用iframe上传并将xml文件转换为json并将其发送回幕后,Chrome正在为传入的数据添加一些垃圾,这些数据只会间歇性地显示并导致“未捕获的SyntaxError:意外的令牌o”错误。

我正在访问这样的iframe数据:

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

在localhost上工作正常,但当我将其上传到服务器时,它只停止使用某些文件,并且仅在按特定顺序加载文件时才能使用。我真的不知道是什么导致了它,但这解决了它。我将上面的行更改为

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

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

长话短说检查您的原始HTML响应数据,然后您可能会改变一些事情。

答案 6 :(得分:0)

确保您的JSON文件之前或之后没有任何尾随字符。也许是一个不可打印的?您可能想尝试这种方式:

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

答案 7 :(得分:0)

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 [对象],而不是一个string

要解决此问题,只需添加await即可:

var json_str = await returnJSONData();

这应该很明显,但是错误是在JSON.parse上调用的,因此如果您的await方法调用和{{ 1}}通话。

答案 8 :(得分: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:JSON中位置1处的意外令牌o-堆栈溢出”