未捕获的 SyntaxError:位置 0 处的 JSON 中出现意外的标记 u

Uncaught SyntaxError: Unexpected token u in JSON at position 0

提问人:Howli 提问时间:10/7/2017 最后编辑:J. ChomelHowli 更新时间:11/2/2023 访问量:283019

问:

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

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)

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

JavaScript JSON 语法错误 magento2

评论

44赞 MinusFour 10/7/2017
我最好的选择是你正在传递给undefinedJSON.parse
1赞 shadowsheep 10/7/2017
我猜“结帐”是对您将开始结帐订单的页面的 POST 请求,对吗?您是否检查了该 HTTP POST 请求的 JSON?我将从这里开始,看看您发送的内容是您可以在结帐页面中管理的内容。
0赞 AlexCode 10/10/2017
打开开发人员工具控制台,在“网络”选项卡中查看脚本的响应。您可能无法返回正确的 json。
0赞 Tom O. 10/12/2017
您能否在 javascript 中放置一个调试器并在传递给 JSON 字符串之前发布它的值?JSON.parse
0赞 Seth Holladay 2/8/2018
嗨,Howli,我们的回答对您有帮助吗?如果是这样,请接受回答。否则,我很乐意提供更多细节。

答:

257赞 Seth Holladay 10/9/2017 #1

在控制台中尝试以下操作:

JSON.parse(undefined)

这是你会得到的:

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

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

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

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

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

确保您的服务器端和客户端脚本都在严格模式下运行,并使用 ESLint 对它们进行 lint 检查。这将使您非常有信心没有错别字。

评论

1赞 Sean 11/9/2019
对我来说,我已经编码了表情符号,使正在解码的 JSON 无效。我的 json 中的字符串中有一个值。我在React Native中使用fetch来发出请求,JSON解析会导致此错误,直到我将Emoji从JSON中删除。更多:ttps://stackoverflow.com/questions/7177808/emoji-characters-cannot-be-encoded-to-jsonð??¸
0赞 Máxima Alekz 10/4/2023
对于浏览器,Chrome 是未捕获的 SyntaxError:“undefined”在 JSON.parse (<anonymous>) 在 <anonymous>:1:6 处无效 JSON
0赞 Ankur 10/11/2017 #2

这是由于页面上的干扰。页面上有多个框架,它们使用窗口消息事件和对象与页面进行通信。它们中很少有可能是第三方服务,例如用于管理 cookie,或者可能是 e-com 集成服务。messagescookieqcartwire

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

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

14赞 kn_pavan 10/12/2017 #3

正如 @Seth Holladay @MinusFour 所评论的那样,您正在解析一个变量。
尝试在执行解析之前添加条件。
undefinedif

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

注意:这只是对大小写的检查。任何其他解析问题仍需要处理。undefined

评论

1赞 Seth Holladay 10/12/2017
没错,这将防止程序崩溃。但是,在大多数情况下,当给定无效输入时,程序崩溃是件好事。不过,这取决于数据的来源。无论哪种方式,请注意,很多东西都是无效的 JSON,而不仅仅是 ,所以这几乎不是一个可靠的检查。nczonline.net/blog/2009/03/03/......undefined
0赞 kn_pavan 10/12/2017
真。这只是涵盖了仍然需要处理的其他问题。将更新我的答案。Unexpected token u in JSON at position 0
2赞 Sveta Oksen 12/5/2019 #4

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

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

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

-2赞 Mekanic 5/24/2020 #5

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

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

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

9赞 JigsSaw 8/17/2020 #6
localStorage.clear()

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

4赞 Alexander Borisov 11/11/2020 #7

你的应用正在尝试分析未定义的 JSON Web 令牌。由于本地存储的错误使用,可能会发生此类故障。尝试清除本地存储。

Google Chrome 示例:

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

评论

0赞 Ricardo 7/20/2021
我刚刚遇到了这个问题,亚历山大·鲍里索夫(Alexander Borisov)是正确的。请允许我将“会话存储”添加到要清除的位置列表中。就我而言,我使用它来存储身份验证令牌,并且该问题出现在从 Flask 过渡到 FastAPI 期间。
0赞 SridharKritha 10/29/2021 #8

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

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

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

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

    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'
    
0赞 Chetali Polekar 11/2/2023 #9

您可以简单地检查数据是否具有某些值或未定义:

if(res){
 let apiResponse = JSON.parse(res);
}

它会起作用的。