web-dev-qa-db-fra.com

Pourquoi jqXHR.responseText renvoie-t-il une chaîne au lieu d'un objet JSON?

J'ai une demande $ .ajax () avec le type de données défini sur "json". Le serveur renvoie JSON avec le type mime correct "application/json". Et pourtant, le responseText de mon objet jqXHR est toujours une chaîne. Qu'est-ce que je fais mal? Est-ce ainsi que c'est censé fonctionner?

Voici comment je fais l'appel:

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

Donc, je dois faire une $.parseJSON(jqXHRObject.responseText) pour obtenir un objet réel. Cela semble inutile car $ .ajax () devrait convertir automatiquement responseText en fonction de la documentation. Merci!

35
user603284

J'ai eu le même problème. Je retourne une chaîne car elle a été formulée à partir d'une exception. Par exemple. J'utilise un écouteur de noyau avec une sérialisation JSON sur mon projet Symfony2. Ce qui est correct pour les en-têtes appropriés REST.

Quoi qu'il en soit, il suffit de l'analyser; cela fonctionne pour moi:

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

Essayer

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

Vous utilisez $ .ajax d'une manière que les documents ne décrivent pas. Utiliser json comme type de données signifie simplement que les données transmises au rappel success seront analysées. Utilisez-le comme ceci:

$.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
kcbanner

Je ne vois rien dans la documentation qui suggère que responseText serait autre chose que ce que son nom implique: text.

Pourquoi ne pas simplement utiliser .getJSON ? Cela éliminerait la moitié du code que vous avez écrit et convertirait la réponse en JSON. Gagner/Gagner.

2
michaeltomer

Étape 1: Stringify le jqXHR

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

Étape 2: changez cette chaîne en objet Jquery

var $errorObj = $(errorString);

Étape 3: Trouvez et obtenez quelle partie de responseText vous voulez.

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

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

C'est tout.

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

    } );
0
Aravindh Gopi