【问题标题】:uncaught syntaxerror unexpected token U JSON未捕获的语法错误意外令牌 U JSON
【发布时间】:2012-10-12 21:31:56
【问题描述】:

当我在 chrome 中运行我的页面时,我收到此错误“未捕获的语法错误意外令牌 U”。在 Firefox 中,我得到“JSON.parse:意外字符”。我正在从 php 文件返回 json 数据,并且返回的 json 字符串是有效的。我用 http://jsonlint.com/ 检查了它。任何帮助将不胜感激...谢谢。

这是返回的 JSON 字符串

[
    ["1","Pan Africa Market","\"1521 1st Ave, Seattle, WA\"","47.608941","-122.340145","restaurant"],
    ["2","The Melting Pot","14 Mercer St, Seattle, WA","47.624562","-122.356442","restaurant"],
    ["3","Ipanema Grill","1225 1st Ave, Seattle, WA","47.606366","-122.337656","restaurant"],
    ["4","Sake House","230 1st Ave, Seattle, WA","47.612825","-122.34567","bar"],
    ["5","Crab Pot","1301 Alaskan Way, Seattle, WA","47.605961","-122.34036","restaurant"],
    ["6","Mexican Kitchen","2234 2nd Ave, Seattle,WA","47.613975","-122.345467","bar"],
    ["7","Wingdome","1416 E Olive Way, Seattle, WA","47.617215","-122.326584","bar"],
    ["8","Piroshky Piroshky","1908 Pike pl, Seattle, WA","47.610127","-122.342838","restaurant"]
]

【问题讨论】:

  • 你能发布 JSON 吗?当我收到该错误时,它通常表明存在未终止的字符串 - 它表明它位于 JSON 中的字母“U”处。
  • 输出中的\" 可能是一些奇怪的问题。
  • JSON 解析得很好。你应该试着弄清楚你的代码实际上是在阻塞什么。

标签: json


【解决方案1】:

解决这个错误非常简单。

原因。 Javascript 给出该错误是因为您正在解析空字符串、对象或数组。

分辨率 所以要解决这个问题,只需检查您尝试解析的字符串是否为空/null 或者不是。 如果不为空/null,则可以解析该字符串。

let ParsedString;

if(yourString != null){
   ParsedString = JSON.parse(yourString);
}

【讨论】:

    【解决方案2】:

    这个答案可能是许多人的可能解决方案。此答案适用于在使用 文件上传..

    时遇到此错误的人

    我们使用中间件进行基于令牌的加密 - 解密,我们遇到了同样的错误。

    以下是我们在路由文件中的代码:

      router.route("/uploadVideoMessage")
      .post(
        middleware.checkToken,
        upload.single("video_file"),
        videoMessageController.uploadVideoMessage
      );
    

    这里我们在上传函数之前调用了中间件,这导致了错误。所以当我们把它改成这个时,它就起作用了。

    router.route("/uploadVideoMessage")
      .post(
        upload.single("video_file"),
        middleware.checkToken,
        videoMessageController.uploadVideoMessage
      );
    

    【讨论】:

      【解决方案3】:

      JSON.parse 的参数可能不返回任何内容(即 JSON.parse 的值是 undefined)!

      当我从 xyz.sol 文件解析 Compiled solidity 代码时发生了这种情况。

      import web3 from './web3';
      import xyz from './build/xyz.json';
      
      const i = new web3.eth.Contract(
        JSON.parse(xyz.interface),
        '0x99Fd6eFd4257645a34093E657f69150FEFf7CdF5'
      );
      
      export default i;
      

      拼写错误为

      JSON.parse(xyz.intereface)
      

      什么都不返回!

      【讨论】:

        【解决方案4】:

        好吧,对于那些实际上在代码中的任何地方都找不到错误的人,既不是“本地存储中所说的未定义也不是 null”……只需注释掉您的代码并编写另一个实际删除该项目的代码本地存储..之后,您可以注释或删除当前代码,并通过简单地取消注释来重新设置前一个代码(如果您使用删除...如果您这样做了,您可以再次编写它:))

        LocalStorage.setItem('Previous' , "removeprevious");  
        
        
        LocalStorage.removeItem('Previous');   
         Console.log(LocalStorage.getItem('Previous'));
        

        控制台将显示 null 并且如果 t 不起作用,它会再次重置您的代码,伙计!您遇到了错误。

        对不起我的英语!

        【讨论】:

          【解决方案5】:

          当我对 json 字符串使用相同的变量并解析 json 时,我收到了这个错误:

          var json = '{"1":{"url":"somesite1","poster":"1.png","title":"site title"},"2":{"url":"somesite2","poster":"2.jpg","title":"site 2 title"}}'
          
          function usingjson(){
              var json = JSON.parse(json);
          }
          

          我将功能更改为:

          function usingjson(){
              var j = JSON.parse(json);
          }
          

          现在这个错误消失了。

          【讨论】:

            【解决方案6】:

            当我在 for 循环中对 JSONArray 运行查找条件时遇到此错误。我面临的问题是 for 循环中的值之一返回 null 的结果。因此,当我尝试访问它失败的属性时。

            因此,如果您在 JSONArrays 中做任何不确定数据源及其完整性的事情,我认为在这种情况下处理 null 和未定义的异常是一个好习惯。

            我通过检查 JSONArray 上 find 的返回值是否为 null 并适当地处理异常来修复它。

            认为这可能会有所帮助。

            【讨论】:

              【解决方案7】:

              这不是一项艰巨的任务。这个问题也出现在我的网站上,你应该把你的 js 文件排在最前面。因为在你使用 JSON Parsing 的地方,这一次你的 JS 文件没有加载。 示例#

              <script type="text/javaScript">
              ...........SOME CODE.............
              </script>
              <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
              

              改成

              <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
              <script type="text/javaScript">
              ...........SOME CODE.............
              </script>
              

              【讨论】:

                【解决方案8】:

                以防你不明白

                例如,可以说我有一个 JSON 字符串 ..还不是 JSON 对象或数组。

                所以如果在javascript中你将字符串解析为

                var body={
                  "id": 1,
                  "deleted_at": null,
                  "open_order": {
                    "id": 16,
                    "status": "open"}
                
                var jsonBody = JSON.parse(body.open_order); //HERE THE ERROR NOW APPEARS BECAUSE THE STRING IS NOT A JSON OBJECT YET!!!! 
                //TODO SO
                var jsonBody=JSON.parse(body)//PASS THE BODY FIRST THEN LATER USE THE jsonBody to get the open_order
                
                var OpenOrder=jsonBody.open_order;
                

                上面的答案很好

                【讨论】:

                  【解决方案9】:

                  在我的例子中,它试图在 XHRResponse 返回之前在 AJAX 变量上调用 JSON.parse()。例如:

                  var response = $.get(URL that returns a valid JSON string);
                  var data = JSON.parse(response.responseText);
                  

                  我用jQuery site for $.get中的一个例子替换了它:

                  <script type="text/javascript"> 
                      var jqxhr = $.get( "https://jira.atlassian.com/rest/api/2/project", function() {
                            alert( "success" );
                          })
                            .done(function() {
                  //insert code to assign the projects from Jira to a div.
                                  jqxhr = jqxhr.responseJSON;
                                  console.log(jqxhr);
                                  var div = document.getElementById("products");
                                  for (i = 0; i < jqxhr.length; i++) {
                                      console.log(jqxhr[i].name);
                                      div.innerHTML += "<b>Product: " + jqxhr[i].name + "</b><BR/>Key: " + jqxhr[i].key + "<BR/>";
                                  }
                                  console.log(div);
                              alert( "second success" );
                            })
                            .fail(function() {
                              alert( "error" );
                            })
                            .always(function() {
                              alert( "finished" );
                            });
                  
                          // Perform other work here ...
                  
                          // Set another completion function for the request above
                          jqxhr.always(function() {
                            alert( "second finished" );
                          });
                  </script>
                  

                  【讨论】:

                    【解决方案10】:

                    发生此错误的最常见情况是使用生成控件的模板,然后更改 id 和/或 name 的生成方式,方法是使用类似

                    的“覆盖”默认模板
                    @Html.TextBoxFor(m => m, new {Name = ViewData["Name"], id = ViewData["UniqueId"]} )
                    

                    然后忘记把ValidationMessageFor改成

                    @Html.ValidationMessageFor(m => m, null, new { data_valmsg_for = ViewData["Name"] })    
                    

                    希望这可以为您节省一些时间。

                    【讨论】:

                      【解决方案11】:

                      我在验证时收到此消息(在 MVC 项目中)。 对我来说,添加 ValidationMessageFor 元素解决了这个问题。

                      确切地说,jquery.validate.unobtrusive.js 中的第 43 行导致了这个问题:

                        replace = $.parseJSON(container.attr("data-valmsg-replace")) !== false;
                      

                      【讨论】:

                      • 这让我走上了正轨;就我而言,我正在做$("form :input").valid(); 来触发验证。但显然它在没有 ValidationMessageFor 的隐藏字段上出现错误。通过更改为$("form :input:visible").valid(); 修复
                      【解决方案12】:

                      当给JSON.parse 的值实际上是undefined 时,通常会看到该错误。 所以,我会检查试图解析这个的代码——很可能你没有解析这里显示的实际字符串。

                      【讨论】:

                      • 它也可能是 "undefined" 作为字符串而不是文字 undefined。我只花了 30 分钟才发现这一点。
                      • @ns47731 其实是一样的。实际 undefined 变为 u 的原因是 undefined 被强制转换为字符串(因为字符串是 JSON.parse 所期望的)。
                      • 呃,正在发送异步请求并立即尝试解析未定义的返回。对自己感到厌恶,谢谢。
                      • 这个错误也会通过 UTF-8{" 在 json 字符串的开头抛出
                      • 我的错误是Unexpected token N in JSON at position...,问题是double 值:NaN
                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2015-12-01
                      • 1970-01-01
                      • 2014-02-09
                      • 2011-04-07
                      • 2011-12-01
                      相关资源
                      最近更新 更多