为什么jqXHR.responseText返回一个字符串而不是一个JSON对象?

时间:2011-04-28 21:48:39

标签: ajax json jquery-1.5 jqxhr

我有一个$ .ajax()请求,其dataType设置为“json”。服务器使用正确的mime类型“application / json”返回JSON。然而,我的jqXHR对象中的responseText始终是一个字符串。我究竟做错了什么?这是它应该如何工作的吗?

以下是我打电话的方式:

var options = { 
    dataType:'json',
    type: 'GET',
    url: "http://example.com/api/"
};

var key = "PassToCallback";

var jqXHRObject =  $.ajax(options).then(
    function(data, textStatus, jqXHR, key) {
        this.success(data, textStatus, jqXHR, key);
    },
    function(jqXHR, textStatus, errorThrown) { 
        this.error(jqXHR, textStatus, errorThrown);
    }
);

console.log(jqXHRObject.getResponseHeader("content-type")); // application/json
console.log(typeof jqXHRObject.responseText); // string

所以我必须做一个$.parseJSON(jqXHRObject.responseText)来获得一个实际的对象。这似乎是不必要的,因为$ .ajax()应该根据文档自动转换responseText。谢谢!

5 个答案:

答案 0 :(得分:50)

我遇到了同样的问题。我返回一个字符串,因为它是根据异常制定的。例如。我在Symfony2项目中使用了一个带有序列化的内核监听器到json。对于正确的REST标头,这是正确的。

无论如何,只需解析它;这对我有用:

$.ajaxSetup({
    "error": function(jqXHR, status, thrownError) {
        alert('error');
        var responseText = jQuery.parseJSON(jqXHR.responseText);
        console.log(responseText);
    }
});

答案 1 :(得分:22)

尝试

$.ajaxSetup({
    "error": function(jqXHR, status, thrownError) {
        alert('error');            
        console.log(jqXHR.responseJSON);
    }
});

答案 2 :(得分:3)

您正在以文档未描述的方式使用$ .ajax。使用json作为dataType只意味着将解析传递给success回调的数据。像这样使用它:

$.ajax({
  dataType:'json',
  type: 'GET',
  url: "http://example.com/api/"
  success: function(data, textStatus, jqXHR) {
    // `data` contains parsed JSON
  },
  error: function(jqXHR, textStatus, errorThrown) {
     // Handle any errors
  }
});

答案 3 :(得分:2)

我没有在文档中看到任何建议表明responseText不是名称所暗示的内容:text。

为什么不使用.getJSON?这将消除您编写的一半代码,并将响应转换为JSON。赢/赢。

答案 4 :(得分:0)

步骤1:对jqXHR进行字符串化

var errorString = JSON.stringify(jqXHR.responseText);

第2步:将该字符串更改为Jquery Object

var $errorObj = $(errorString);

第3步:查找并获取所需的responseText部分。

var errorMessage = $errorObj.find('p').eq(1).text(); 

/* Here Im finding `Message:` thrown by the server, which is inside <p> tag */

多数民众赞成。

$.ajax( /* ... */ ).fail( function(jqXHR, textStatus, errorThrown) {

     var errorString = JSON.stringify(jqXHR.responseText);
     var $errorObj = $(errorString);
     var errorMessage = $errorObj.find('p').eq(1).text();

     alert(errorMessage);

    } );