Ajax 解析Json会导致未捕获的语法错误
我的浏览器(chrome)告诉我,这是我通过JsonLint验证为有效的服务器返回的内容: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":[
[{"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页面。也许我错过了什么。但我不希望在这里有无证行为。希望这会有帮助。