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

时间:2014-04-01 23:59:40

标签: 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":"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);

似乎产生了一个我可以通过开发人员工具查询的有效对象:

enter image description here

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

内容类型:应用/ JSON;字符集= UTF-8

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

1 个答案:

答案 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将作为字符串返回)。