【问题标题】:Uncaught SyntaxError: Unexpected token u in JSON at position 0未捕获的 SyntaxError:位置 0 处 JSON 中的意外标记 u
【发布时间】:2018-03-18 16:52:27
【问题描述】:

仅在结帐时和单个产品页面上,我在控制台日志中收到以下错误:

VM35594:1 Uncaught SyntaxError: Unexpected token u in JSON at position 0
    at JSON.parse (<anonymous>)
    at run (layout.min.js:9)
    at app.min.js:1
    at main.min.js:2
    at Object.execCb (require.min.js:112)
    at Module.check (require.min.js:56)
    at Module.<anonymous> (require.min.js:72)
    at require.min.js:11
    at require.min.js:74
    at each (require.min.js:3)

我正在使用单页结帐扩展程序,但是当我禁用它时,错误仍然显示。我认为这可能与产品页面上的评论有关(因为我将评论移出选项卡),但撤消该更改并不能解决产品页面上的错误。

【问题讨论】:

  • 我最好的选择是您将 undefined 传递给 JSON.parse
  • 我猜“结帐”是对您将开始结帐订单的页面的 POST 请求,对吧?你检查了那个 HTTP POST 请求的 JSON 吗?我将从这里开始,看看您发送的内容是您可以在结帐页面中管理的内容。
  • 打开开发者工具控制台并在网络选项卡上查看脚本的响应。您可能无法返回正确的 json。
  • 您能否在您的 javascript 中放置一个调试器,并在 JSON 字符串传递给JSON.parse 之前发布它的值?
  • 您好 Howli,我们的回答对您有帮助吗?如果是这样,请接受答案。否则,我很乐意提供更多详细信息。

标签: javascript json syntax-error magento2


【解决方案1】:

在控制台中试试这个:

JSON.parse(undefined)

你会得到什么:

Uncaught SyntaxError: Unexpected token u in JSON at position 0
    at JSON.parse (<anonymous>)
    at <anonymous>:1:6

换句话说,您的应用正在尝试解析 undefined,这是无效的 JSON。

这有两个常见的原因。首先是你可能引用了一个不存在的属性(如果不是在严格模式下,甚至是一个不存在的变量)。

window.foobar = '{"some":"data"}';
JSON.parse(window.foobarn)  // oops, misspelled!

第二个常见原因是一开始就无法接收 JSON,这可能是由于客户端脚本忽略错误并在不应该发送请求时发送的。

确保您的服务器端和客户端脚本都在 strict mode 中运行,并使用 ESLint 对它们进行 lint。这将使您确信没有错别字。

【讨论】:

  • 对我来说,我编码的表情符号使被解码的 JSON 无效。在我的ð??¸ 的 json 中的字符串中有一个值。我在 React Native 中使用 fetch 来发出请求,而 JSON 解析会导致这个错误,直到我将 Emoji 从 JSON 中取出。更多信息:ttps://stackoverflow.com/questions/7177808/emoji-characters-cannot-be-encoded-to-json
【解决方案2】:

正如@Seth Holladay @MinusFour 所说,您正在解析一个undefined 变量。
在进行解析之前尝试添加if 条件。

if (typeof test1 !== 'undefined') { test2 = JSON.parse(test1); }

注意:这只是检查undefined 的情况。任何其他解析问题仍然需要处理。

【讨论】:

  • 没错,这将防止程序崩溃。然而,在大多数情况下,当给定无效输入时,程序崩溃是好的。不过,这取决于数据的来源。无论哪种方式,请注意很多东西都是无效的 JSON,而不仅仅是undefined,所以这几乎不是一个可靠的检查。 nczonline.net/blog/2009/03/03/…
  • 是的。这仅涵盖Unexpected token u in JSON at position 0 和其他仍需要处理的问题。将更新我的答案。
【解决方案3】:
localStorage.clear()

这将清除存储的数据。然后刷新,一切都应该开始工作了。

【讨论】:

    【解决方案4】:

    对我来说,这是因为我的页面中有一个空组件 -

    <script type="text/x-magento-init">
       {
       ".page.messages": {
           "Magento_Ui/js/core/app": []        
          }
       }
    

    删除这段代码解决了这个问题。

    【讨论】:

      【解决方案5】:

      您的应用正在尝试解析未定义的 JSON Web 令牌。此类故障可能是由于本地存储使用不当造成的。尝试清除本地存储。

      谷歌浏览器示例:

      1. F12
      2. 应用
      3. 本地存储
      4. 全部清除

      【讨论】:

      • 我刚刚遇到了这个问题,Alexander Borisov 是正确的。请允许我将“会话存储”添加到要清除的位置列表中。就我而言,我使用它来存储身份验证令牌,并且在从 Flask 到 FastAPI 的过渡期间出现了问题。
      【解决方案6】:

      这是由于出现在页面上的干扰 messages。页面上有多个使用窗口消息事件和对象与页面通信的框架。其中很少有第三方服务,例如用于管理 cookie 的 cookieq,或者可能是 cartwire 电子商务集成服务。

      您需要处理 onmessage 事件以检查消息来自何处,然后相应地解析 JSON。

      我遇到了类似的问题,其中一个集成是传递一个 JSON 对象,另一个是传递一个以 u 开头的字符串

      【讨论】:

        【解决方案7】:

        如果您收到Uncaught SyntaxError: Unexpected token u in JSON at position 0,那么您可以进行以下快速检查:

        jsObj = JSON.parse(data)
        
        1. 数据 - 检查数据是否未定义

        2. data - 检查数据是否是有效的 JSON 字符串

        3. 数据 - 检查数据是否被不需要的空格损坏

          data = data.trim(); // remove the unwanted whitespace
          jsObj = JSON.parse(data);
          
        4. data - 检查接收到的数据是否使用正确的编码格式('utf8', 'utf16le', 'ucs2'

          fs.readFile(file, 'utf8', function(err, data) { ... });
          
          fs.readFile(file, 'utf16le', function(err, data) { ... }); // le - little endian
          
          fs.readFile(file, 'ucs2', function(err, data) { ... });   // kind  of 'utf16le'
          

        【讨论】:

          【解决方案8】:

          我有这个问题两天了,让我告诉你我是如何解决的。

          这是我收到错误时代码的样子:

          request.onload = function() {
              // This is where we begin accessing the Json
              let data = JSON.parse(this.response);
              console.log(data)
          }
          

          这是我为了得到我想要的结果而改变的:

          request.onload = function() {
              // This is where we begin accessing the Json
              let data = JSON.parse(this.responseText);
              console.log(data)
          }
          

          所以我真正所做的只是改变 this.responsethis.responseText

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-05-28
            • 1970-01-01
            • 2021-12-06
            • 1970-01-01
            • 2016-09-04
            • 1970-01-01
            • 2016-09-21
            相关资源
            最近更新 更多