我的浏览器(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":[]}]
如果我只是将此内容复制到脚本var中,它也会正确解析。
但是,如果我尝试将这个从服务器返回的内容解析为一个对象,我会得到一个Uncaught Syntax错误:
$.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对象了吗?所以我不太清楚这里发生了什么。我认为这可能与响应标头有关,但是这个有效负载是通过以下方式发送的:
内容类型:应用/ JSON;字符集= UTF-8
标题就像在我使用JSON.parse(data)的应用程序中的其他页面一样;从服务器返回的数据创建JSON对象。那么这里有什么不同,为什么我不能解析它?如果它已经是JSON对象,那么它是如何创建的?
答案 0 :(得分:2)
你解析json两次。数据参数function (data)
已经是javascript对象,因为您已使用dataType: "json"
。来自jQuery docs:
" json":将响应评估为JSON并返回JavaScript对象。 JSON数据以严格的方式解析;任何格式错误的JSON都会被拒绝,并抛出一个解析错误。从jQuery 1.9开始,空响应也被拒绝;服务器应该返回null或{}的响应。 (有关正确的JSON格式的更多信息,请参阅json.org。)
您不需要致电var status = JSON.parse(data);
。只需使用data
,因为您使用JSON.parse
的结果。
此外,如果您的服务器返回json内容类型,则jQuery将选择dataType
为"json"
。来自docs:
如果没有指定,jQuery将尝试根据响应的MIME类型推断它(XML MIME类型将产生XML,在1.4 JSON中将产生一个JavaScript对象,在1.4脚本中将执行脚本,以及任何东西else将作为字符串返回)。