2012-02-02 6 views
4

私は質問でajaxリクエストを行い、私のレスポンスがすでにJSオブジェクトであるのか疑問に思っています。なぜ「jQuery.parseJSON」は不要ですか?

私は

var obj = jQuery.parseJSON(response); 

を行う場合は「objのnullですが、私は、JSオブジェクトの配列としての '応答' を使用することができます。

これは実際問題ではありませんが、この動作を理解したいと思います。

おかげ

答えて

10

あなたはAJAX呼び出しを行うとJSON jQueryのは、あなたのための応答にjQuery.parseJSONを呼び出してデータ型を指定するとき、この問題が発生しました。実際にあなたがdocumentation

コンバータから(1.5を追加しました)SEできるようdataTypeと
地図のデフォルトに応じて呼び出すためにどのような機能を指定することができます:{「*テキスト」:window.Stringを、「テキスト HTML ":true、" text json ":jQuery.parseJSON、" text xml ": jQuery.parseXML}データ型からデータ型への変換のマップ。あなたはjQueryのは、それを推測しようとするデータ型を指定しない場合は、この

$.ajax({ 
    url: yoururl, 
    dataType: "json", 
    success: function(data){ 
    //data is already a json 
    } 

のような呼び出しを行う場合は、各 コンバータの値が 応答

程度の変換値を返す関数であります

dataTypeStringデフォルト:インテリジェントゲス(XML、JSON、スクリプト、または HTML)

サーバーから返されるデータのタイプ。 が指定されていない場合、jQueryはMIMEタイプ に基づいてそれを推測しようとします(XML MIMEタイプはXMLを生成します.1.4 JSONではJavaScriptオブジェクト が生成されます)。1.4スクリプトはスクリプトを実行し、 他のものは文字列として返されます)。使用可能な型(および成功コールバックの最初の引数として渡された結果は ):

"jml":jQueryで処理できるXMLドキュメントを返します。
"html":HTMLをプレーンテキストとして返します。含まれているスクリプトタグは、DOMに挿入されると と評価されます。 "script":レスポンスを JavaScriptとして評価し、プレーンテキストとして返します。 オプションがtrueに設定されていない限り、 クエリ文字列パラメータ「= [TIMESTAMP]」をURLに追加してキャッシュを無効にします。注:これにより、 リモートドメイン要求のPOSTがGETに変わります。 "json":レスポンスをJSONとして評価し、 はJavaScriptオブジェクトを返します。 jQuery 1.4では、JSONデータは厳密には で解析されます。不正な形式のJSONはすべて拒否され、解析エラーは にスローされます。 (適切なJSONフォーマットの詳細については、json.orgを参照してください。)
"jsonp":JSONPを使用してJSONブロックに読み込みます。追加の を追加しますか? "callback =?" URLの末尾にコールバックを指定します。キャッシュオプションがtrueに設定されていない限り、 URLにクエリ文字列パラメータ "
= [TIMESTAMP]"を追加してキャッシュを無効にします。
"text":プレーンテキスト 文字列。
jQuery 1.5以降、jQueryは のデータ型をContent-Typeヘッダーで受け取ったものから に変換できます。たとえば、テキスト応答が になり、XMLとして扱われるようにするには、dataTypeに "text xml"を使用します。 JSONPリクエストをテキストとして受信し、jQueryによって XML: "jsonp text xml"と解釈することもできます。同様に、 "jsonp xml"のような省略形の文字列は、まずjsonpからxmlへの変換を試み、 に失敗し、jsonpからtextへ、そしてtextからxmlへの変換を試みます。

+2

さらに、サーバーは 'Content-Type'ヘッダーを' application/json'に設定することができ、jQueryは応答フォーマットを推測します*。 – Matt

+0

"もちろん、正しいヘッダーサーバー側を設定する必要があります*"は間違っています。 jQuery *は 'dataType'を設定するものを信頼します。それは*ベスト推測*する必要がある場合のみ、ヘッダーをチェックします。 – Matt

+0

@Matt ok私はそれを変更します –

1

それが機能毎回のJSONレスポンスを実行しますIE

jQuery.ajaxSettings.converters["text json"] === jQuery.parseJSON 

ので

+0

これはなぜオブジェクトが返されるのか "*理由*"ではありません。これにより、オブジェクトが返される可能性があります( '* - > text'、次に' text - > json'のコンバーターがあります)。しかし実際には 'dataType'またはベスト推測変換。 – Matt

+0

@Mattはい、その関数を "hello"にすると、検出されたすべての応答jsonが "hello"を返します。私はすべての回答のうち 'for(;;);を前処理するためにこれを使用しています。 – Esailija

2

を自動的に検出または明示的に自分で設定されているjQueryのAJAXメソッドのデフォルトの動作は、応答を分析し、それを返すことです最も適切なデータタイプとして選択します。したがって、応答がJSONのように見える場合、JavaScriptオブジェクト/配列に変換されます。

この動作を無効にするには、ajax設定でdataType属性を設定します。

4

これはかなりあなたのjQuery ajaxリクエストに渡したのはdataTypeです。これは、.getJSON()を呼び出すか、$.ajax()を使用して直接呼び出すことによって発生する可能性があります。

ただし、dataTypeを省略すると、jQueryはどのデータを受け取ったかを推測します。 JSONデータの場合、単純な正規表現を使用して応答がJSON文字列のように見えるかどうかをチェックし、そうであれば自動的に解析します。 jQueryは、応答のMIMEタイプに基づいてそれを推測しようとします。

常に正確で、jQueryに期待するデータの種類を教えてください。

+1

コンテンツタイプヘッダーまたはオーバーライドされたMIMEタイプを単にチェックするだけで、応答コンテンツの構文解析が行われていないタイプを確認します。 – Esailija

+0

@Esailija:true fixed。正規表現 'parseJSON'が内部で使用する検証については混乱しました。 – jAndy

2

を指定した場合

$.ajax({ 
... 
dataType:'json', 
... 
}); 

同じことがjQuery.getJSON()

で、これはgetJSONのソースコードは

getJSON: function(url, data, callback) { 
return jQuery.get(url, data, callback, "json"); 
}, 
どのように見えるかである場合であるように dataType jsonとしてjqueryのは、あなたのための応答を解析し、

https://github.com/jquery/jquery/blob/master/src/ajax.js#L283

関連する問題