Почему jqXHR.responseText возвращает строку вместо объекта JSON? - PullRequest
35 голосов
/ 29 апреля 2011

У меня есть запрос $ .ajax () с dataType, установленным в «json».Сервер возвращает JSON с правильным MIME-типом «application / json».И все же responseText в моем объекте jqXHR всегда является строкой.Что я делаю неправильно?Вот как это должно работать?

Вот как я звоню:

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 ]

50 голосов
/ 22 июля 2012

У меня была такая же проблема.Я возвращаю строку, потому что она сформулирована из исключения.Например, я использую слушатель ядра с сериализацией в json в моем проекте Symfony2.Что правильно для правильных заголовков REST.

В любом случае, просто проанализируйте его;это работает для меня:

$.ajaxSetup({
    "error": function(jqXHR, status, thrownError) {
        alert('error');
        var responseText = jQuery.parseJSON(jqXHR.responseText);
        console.log(responseText);
    }
});
22 голосов
/ 14 февраля 2014

Попробуйте

$.ajaxSetup({
    "error": function(jqXHR, status, thrownError) {
        alert('error');            
        console.log(jqXHR.responseJSON);
    }
});
3 голосов
/ 29 апреля 2011

Вы используете $ .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
  }
});
2 голосов
/ 29 апреля 2011

Я не вижу ничего в документации, которая предполагает, что responseText будет чем-то отличным от того, что подразумевает название: text.

Почему бы просто не использовать .getJSON ?Это избавит от половины написанного вами кода и преобразует ответ в JSON.Win / выигрыш.

0 голосов
/ 19 февраля 2017

Шаг 1: строковый тип jqXHR

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

Шаг 2: измените эту строку на Jquery Object

var $errorObj = $(errorString);

Шаг 3: Найдите и получите, какую часть responseText вы хотите.1007 *

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

    } );
...