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



我有一个$.ajax()请求,数据类型设置为"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。谢谢!

我也遇到了同样的问题。I返回一个字符串,因为它是由异常形成的。例如,我在Symfony2项目上使用了一个序列化为json的内核监听器。这对于适当的REST头是正确的。

无论如何,解析它;

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

Try

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

您正在使用$。以文档中没有描述的方式使用Ajax。使用json作为数据类型仅仅意味着传递给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
  }
});

我在文档中没有看到任何东西表明responseText应该是除了名字所暗示的:text之外的任何东西。

为什么不直接使用。getjson ?这将省去您编写的一半代码,并将响应转换为JSON。赢/赢。

第一步:字符串化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);
    } );

最新更新