未捕获的语法错误:意外令牌 U JSON。

327

在Chrome中运行我的页面时,我收到了错误消息“未捕获的语法错误:意外的token U”,而在Firefox中,我收到了“JSON.parse: unexpected character”的错误消息。我从一个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”处。 - Kyle Burton
可能输出中的\"存在一些奇怪的问题。 - Felix Kling
那个 JSON 解析得很好。你应该试着找出你的代码实际上卡在哪里了。 - nneonneo
13个回答

707

当给JSON.parse的值实际上是undefined时,通常会出现该错误。 因此,我建议检查试图解析此代码的代码 - 很可能您没有解析此处显示的实际字符串。


37
它可能是字符串形式的"undefined"而不是字面上的undefined。我刚刚花了30分钟才发现这一点。 - ug_
14
这实际上是一样的。undefined 变成 u 的原因是因为 undefined 被强制转换成字符串(因为JSON.parse期望一个字符串)。 - Sean Kinsey
10
啊,我正在发送一个异步请求并立即尝试解析未定义的返回值。对自己感到十分不满意,谢谢。 - Chris Trudeau
7
这个错误也可能是由于在 JSON 字符串开头处出现了一个 UTF-8{" 引起的。 - metamagikum
1
我的错误是 JSON 中未预期的 N 令牌位于位置...,问题是一个 double 值:NaN - Jaider
显示剩余2条评论

14

在我的MVC项目中进行验证时,我遇到了这个错误信息。 对我来说,添加ValidationMessageFor元素解决了这个问题。

要精确地说,是jquery.validate.unobtrusive.js文件中的第43行引起了这个问题:

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

这让我找到了正确的方法。在我的情况下,我正在执行 $("form :input").valid(); 来触发验证。但显然它在一个没有 ValidationMessageFor 的隐藏字段上出现了错误。通过更改为 $("form :input:visible").valid(); 解决了问题。 - Trax72

12

JSON.parse的参数可能返回空值(即为JSON.parse提供的值是undefined)!

当我解析来自xyz.sol文件的编译后的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)

返回了空值!


5
这个错误最常见的情况是使用生成控件的模板,然后通过“覆盖”默认模板并更改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"] })    

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


3

解决这个错误非常简单。

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

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

let ParsedString;

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

3
我在for循环中对JSONArray运行一个查找条件时,遇到了这个错误。我面临的问题是for循环中的某个值返回了null,因此当我试图访问该项属性时失败了。
因此,如果您在JSONArrays内执行任何操作时不确定数据源及其完整性,我认为在这种情况下处理null和undefined异常是一个好习惯。
通过检查JSONArray上find返回的值是否为null并适当处理异常来解决了这个问题。希望这会有所帮助。

3

如果您不理解,例如我有一个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;

上面的答案很好。

1

如果你在代码中无法找到错误,无论是本地存储中的“undefined”还是“null”,那么只需注释掉你的代码并编写另一个实际上从本地存储中删除该项的代码。之后,您可以注释或删除当前代码,并通过取消注释来重新设置以前的代码(如果您没有删除它...如果您删除了它,您可以再次编写它:)

LocalStorage.setItem('Previous' , "removeprevious");  


LocalStorage.removeItem('Previous');   
 Console.log(LocalStorage.getItem('Previous'));

如果控制台显示null并且它重置了你的代码,那么请再次尝试,如果不起作用,请检查错误。

对不起,我的英语不好!


1
在我的情况下,是在XHRResponse返回之前尝试在一个AJAX变量上调用JSON.parse()。例如:
var response = $.get(URL that returns a valid JSON string);
var data = JSON.parse(response.responseText);

我从jQuery网站的$.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>

1
这个答案是众多可能解决方案之一。此答案适用于在使用文件上传时遇到此错误的人们。
我们使用了基于令牌的加密 - 解密中间件,遇到了同样的错误。
以下是我们路由文件中的代码:
  router.route("/uploadVideoMessage")
  .post(
    middleware.checkToken,
    upload.single("video_file"),
    videoMessageController.uploadVideoMessage
  );

在调用上传函数之前,我们调用了中间件,这导致了错误。因此,当我们将其更改为以下内容时,它就可以正常工作。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接