Ajax 解析Json会导致未捕获的语法错误

Ajax 解析Json会导致未捕获的语法错误,ajax,json,Ajax,Json,我的浏览器(chrome)告诉我,这是我通过JsonLint验证为有效的服务器返回的内容: [{"Id":"bdd937ef-c0d4-4191-805f-316288144060","Name":"Accessories and Auto Parts, Moto ","L18nName":null,"State":null,"L18n":"1033","Index":0,"LevelId":0,"ImagePath":"/content/img/browse/sm/","Children":[

我的浏览器(chrome)告诉我,这是我通过JsonLint验证为有效的服务器返回的内容:

[{"Id":"bdd937ef-c0d4-4191-805f-316288144060","Name":"Accessories and Auto Parts, Moto ","L18nName":null,"State":null,"L18n":"1033","Index":0,"LevelId":0,"ImagePath":"/content/img/browse/sm/","Children":[]},{"Id":"b01bde48-6f1d-4168-aee4-a7e62eef7bd0","Name":"Car Rental","L18nName":null,"State":null,"L18n":"1033","Index":0,"LevelId":0,"ImagePath":"/content/img/browse/sm/","Children":[]},{"Id":"c039a467-1709-433f-a316-008f6ae301fb","Name":"Car Sales ","L18nName":null,"State":null,"L18n":"1033","Index":0,"LevelId":0,"ImagePath":"/content/img/browse/sm/","Children":[]}]
如果我只是将此内容复制到脚本变量中,它也将正确解析

但是,如果我尝试将此内容(从服务器返回)解析为对象,则会出现未捕获的语法错误:

 $.ajax({
                    type: "POST",
                    url: "/Browse/SubCategoryLister/",
                    data: { rfqID: parentRfqId },
                    dataType: "json"
                })
                .done(function (data) {
                    rp.hide();
                    sc.show();
                    console.log(data);
                    var status = JSON.parse(data);
                    console.log(status);
                });
在线

var status = JSON.parse(data);
然而

console.log(data);
似乎生成了一个有效的对象,我可以通过开发人员工具进行查询:

所以看起来数据已经是一个json对象了?所以我不太清楚这里发生了什么。我认为这可能与响应头有关,但此有效负载通过以下命令发送:

内容类型:application/json;字符集=utf-8


标题就像我在应用程序中使用JSON.parse(数据)的其他页面一样;从服务器返回的数据创建JSON对象。那么这里的区别是什么?为什么我不能解析它?如果它已经是一个JSON对象,那么它是如何创建的?

您需要解析JSON两次。数据参数
函数(数据)
已经是javascript对象,因为您使用了
数据类型:“json”
。发件人:

“json”:将响应计算为json并返回一个JavaScript对象。JSON数据被严格解析;任何格式错误的JSON都将被拒绝,并引发解析错误。从jQuery1.9开始,空响应也被拒绝;服务器应该返回null或{}响应。(有关正确json格式的更多信息,请参见json.org。)

您不需要调用
var status=JSON.parse(数据)。只需使用
data
,就像使用
JSON.parse的结果一样

更新 另外,如果服务器返回json内容类型,那么jQuery将选择
dataType
作为
“json”
。从文档:

如果未指定,jQuery将尝试根据响应的MIME类型推断它(XML MIME类型将生成XML,在1.4中JSON将生成JavaScript对象,在1.4中脚本将执行脚本,其他任何内容都将作为字符串返回)


我考虑过这一点,但如果我去掉数据类型:“json”,它仍然会失败,console.log(data)仍然会“通过”。所以你是说,当你删除
数据类型:“json”
时,你仍然会在
数据中得到javascript对象。对吗?如果服务器返回“json”内容类型,则可能会发生这种情况。请参阅我的最新答案。如果要在
.done(…)
中显式解析json,请设置
数据类型:“text
或使服务器返回“Content type:text/plain”。是的。服务器是ASP.NET MVC,返回JsonResult,这就是我检查标题的原因,但在需要解析json.parse()的情况下在这种情况下,我不知道响应标题等是相同的,所以我很困惑。这并没有阻碍我,我不需要显式解析它,但我确实想知道为什么会发生这种情况。我会将你的标记为答案,并对我的标题等进行双重检查。对我来说,这是唯一的“信号”“这可能是通过响应头实现的。您可能还需要阅读jQuery ajax页面。也许我错过了什么。但我不希望在这里有无证行为。希望这会有帮助。