37

我有一个数据类型设置为“json”的 $.ajax() 请求。服务器正在返回带有正确 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。谢谢!

4

5 回答 5

53

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

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

$.ajaxSetup({
    "error": function(jqXHR, status, thrownError) {
        alert('error');
        var responseText = jQuery.parseJSON(jqXHR.responseText);
        console.log(responseText);
    }
});
于 2012-07-21T20:45:37.963 回答
24

尝试

$.ajaxSetup({
    "error": function(jqXHR, status, thrownError) {
        alert('error');            
        console.log(jqXHR.responseJSON);
    }
});
于 2014-02-14T15:35:15.263 回答
3

您正在以文档未描述的方式使用 $.ajax。使用jsonas 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
  }
});
于 2011-04-28T23:13:25.417 回答
2

我在文档中没有看到任何表明 responseText 与名称所暗示的完全不同的任何内容:文本。

为什么不直接使用.getJSON?这将摆脱您编写的一半代码,并将响应转换为 JSON。双赢。

于 2011-04-28T23:07:40.950 回答
-1

第 1 步:字符串化 jqXHR

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

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

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);

    } );
于 2017-02-19T15:46:40.623 回答