web-dev-qa-db-ja.com

jqXHR.responseTextがJSONオブジェクトではなく文字列を返すのはなぜですか?

DataTypeが「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を自動的に変換する必要があるため、これは不要なようです。ありがとう!

35
user603284

同じ問題がありました。例外から定式化されたため、文字列を返します。例えば。 Symfony2プロジェクトでjsonへのシリアル化でカーネルリスナーを使用します。適切なRESTヘッダーに対して正しい。

とにかく、解析するだけです。これは私のために働く:

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

試して

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

ドキュメントで説明されていない方法で$ .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
  }
});
3
kcbanner

ドキュメントには、responseTextが名前が示すとおりのテキスト以外のものであることを示唆するものはありません。

。getJSON を使用しないのはなぜですか?それはあなたが書いたコードの半分を取り除き、レスポンスをJSONに変換します。勝ち勝ち。

2
michaeltomer

ステップ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);

    } );
0
Aravindh Gopi