【问题标题】:I keep getting "Uncaught SyntaxError: Unexpected token o"我不断收到“Uncaught SyntaxError: Unexpected token o”
【发布时间】:2020-07-29 22:03:46
【问题描述】:

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

【问题讨论】:

  • $.get 在发送时可以识别 json,因此。 var glacier = data; 应该足够了。
  • 总结一下:你试图解析它两次。
  • 我得到了类似的 Uncaught SyntaxError: Unexpected token I,因为 Python 编码了 json.dumps([float('inf'),float('nan')]) == '[Infinity, NaN]'

标签: javascript jquery json


【解决方案1】:

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

更多解释可以在Aditya Mittal's answer找到。

【讨论】:

  • 啊哈,所以 data[0].english 返回“bag”。看起来我根本不需要解析 json 文件。
  • 这很有趣.. 我猜 jquery 猜测数据类型并假设它是 json。我认为 getJson 也会起作用,对吧?
  • 小提示:如果你JSON.parse 一个对象,则抛出“Unexpected token o”仅仅是因为它试图解析obj_to_parse.toString(),即[object Object]。尝试JSON.parse('[object Object]'); ;)
  • 这也发生在我身上,我认为我的错误是我试图将已经是 JSON 对象的东西解析为 JSON
  • jQuery 不会猜测。如果您不使用dataType 覆盖它(为什么会这样),它会使用响应的Content-type HTTP 标头来确定它是什么类型的数据,并在它是 jQuery 识别的数据时对其进行解析。
【解决方案2】:

问题很简单

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

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

【讨论】:

    【解决方案3】:

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

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

    var parsed = JSON.parse(data);
    

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

    var parsed = data;
    

    【讨论】:

    • 请注意,任何对此投反对票的人,上面接受的答案包含此答案的精确副本。现在从接受的答案中添加链接。
    【解决方案4】:

    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 错误的答案。因此,它可能会帮助其他遇到这个问题的人。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        我刚才遇到了类似的问题,我的解决方案可能会有所帮助。我正在使用 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 对象,有时却没有。我没有时间继续这个项目,所以我不知道它是否会随机执行此操作(取决于浏览器和系统或其他东西)。感谢您的指点,我会记住的。
        【解决方案7】:
        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 调用之间有一些距离,很容易错过。

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

          • JSON.parse('[{"english":"bag","kana":"kaban","kanji":"K"},{"english":"glasses","假名":"megane","汉字":"M"}]');工作正常。 ¿您是否尝试用 alert(data) 替换该行以检查文件是否正确加载?
          【解决方案9】:
          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

          【讨论】:

            猜你喜欢
            • 2015-07-01
            • 1970-01-01
            • 1970-01-01
            • 2019-03-31
            • 1970-01-01
            • 2013-10-14
            • 2013-09-29
            相关资源
            最近更新 更多