Почему jqXHR.responseText возвращает строку вместо объекта JSON?
У меня есть запрос $.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 в соответствии с документами. Спасибо!
Ответы
Ответ 1
У меня была та же проблема. Я возвращаю строку, потому что она сформулирована из исключения. Например. Я использую прослушиватель ядра с сериализацией json в моем проекте Symfony2. Что правильно для правильных заголовков REST.
В любом случае, просто проанализируйте его; это работает для меня:
$.ajaxSetup({
"error": function(jqXHR, status, thrownError) {
alert('error');
var responseText = jQuery.parseJSON(jqXHR.responseText);
console.log(responseText);
}
});
Ответ 2
Try
$.ajaxSetup({
"error": function(jqXHR, status, thrownError) {
alert('error');
console.log(jqXHR.responseJSON);
}
});
Ответ 3
Я не вижу ничего в документации, которая предполагает, что responseText будет чем-то иным, чем то, что подразумевает название: text.
Почему бы просто не использовать .getJSON? Это избавит вас от половины кода, который вы написали, и преобразует ответ в JSON. Win/выигрыш.
Ответ 4
Вы используете $.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
}
});
Ответ 5
Шаг 1: Строим jqXHR
var errorString = JSON.stringify(jqXHR.responseText);
Шаг 2: измените эту строку на объект JQuery
var $errorObj = $(errorString);
Шаг 3: Найдите и получите часть ответа, которую вы хотите.
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);
} );