$ .ajaxでクエリ文字列の代わりにJSONを送信する方法は?


172

誰かがjQueryにクエリ文字列ではなく実際のJSONを送信させる方法を簡単な方法で説明できますか?

$.ajax({
    url      : url,
    dataType : 'json', // I was pretty sure this would do the trick
    data     : data,
    type     : 'POST',
    complete : callback // etc
});

これにより、実際に慎重に準備されたJSONがクエリ文字列に変換されます。煩わしいことの1つは、おそらくクエリ文字列の制限のためarray: []array[]: []、オブジェクト内のすべてがに変換されることです。


7
dataTypeデータが送信される方法とは関係ありません。呼び出しによって返されると予想されるデータのタイプを指定するだけです。あなたは、データの種類は、あなたがに指定されているものを、サーバーに指示したい場合dataは、設定する必要があるプロパティcontentTypeに似てプロパティcontentType: "application/json"
いや

明確にしていただきありがとうございます。しかしその場合、サーバーが応答でコンテンツタイプヘッダーを提供しているのに、なぜクライアント側で応答タイプを指定する必要があるのでしょうか。
Redsandro

2
指定する必要はありません。デフォルトでは、jQueryは応答のMIMEタイプに基づいてインテリジェントな推測を試みます。ただし、これを指定することにより、jQueryにサーバーから期待するタイプを明示的に伝え、jQueryは応答をそのタイプのオブジェクトに変換しようとします。それを指定せずにjQueryを離れると、サーバーからJSONを送信した場合でも、jQueryが応答を予期しない形式に変換する可能性があります。dataTypeの
Nope

回答:


256

を使用JSON.stringifyして、最初にオブジェクトをJSONにシリアル化してcontentTypeから、サーバーがJSONを理解できるようにを指定する必要があります。これでうまくいくはずです:

$.ajax({
    url: url,
    type: "POST",
    data: JSON.stringify(data),
    contentType: "application/json",
    complete: callback
});

このJSONオブジェクトは、JavaScript 1.7 / ECMAScript 5以降をサポートするブラウザーでネイティブに使用できることに注意してください。レガシーサポートが必要な場合は、json2を使用できます。


14
これは機能しませんcontentType: 'application/json'
Ohgodwhy

@Ohgodwhyああそう。それは少し速すぎました;)
mekwall

1
ありがとう。dataTypeがこれを処理すると思っていましたが、逆方向に取得しました。Bergiのようなcontent-typeで文字セットを指定することについて他の答えでしたか?
Redsandro

5
@Redsandro必要ないはずです。jQuery docsによると:POST data will always be transmitted to the server using UTF-8 charset, per the W3C XMLHTTPRequest standard
mekwall

1
@ shorif2000遅くなることはない...問題は$_POST、phpで表示できるのはだけでapplication/x-www-form-urlencoded、jsonデータを読みたい場合は、実行する必要がfile_get_contents("php://input")あり、おそらくjson_decode()
a santiago arizti

28

いいえ、dataTypeオプションは受信したデータを解析するためのものです。

JSONを投稿するには、自分でJSONを文字列化しJSON.stringifyprocessDataオプションをに設定する必要がありますfalse

$.ajax({
    url: url,
    type: "POST",
    data: JSON.stringify(data),
    processData: false,
    contentType: "application/json; charset=UTF-8",
    complete: callback
});

すべてのブラウザーがJSONオブジェクトをサポートしているわけではないことに注意してください。jQueryにはが.parseJSONありますが、ストリング指定子は含まれていません。別のポリフィルライブラリが必要になります。


4
すでに文字列を返しているので、に設定processDataするfalse必要はありませんJSON.stringify
mekwall

@MarcusEkwall:AfaikそれはまだencodeURIComponent編集されるでしょうね?
Bergi、

OK、それは必要ないかもしれませんが、本当にそれがリクエストを失敗させると思いますか?
Bergi、

それはすでに文字列であることを考えると、失敗しないはずです。
Kevin B

1
@Redsandro:ええ、「インテリジェントな推測」をしています。ただし、パラメーターの理由は、ユーザーがそれを厳密にしたい(というだけの)理由ではなく、サーバーの応答で適切なMIMEタイプを設定しないためです。
Bergi、2012年

5

ASP.NET MVCのような多くのアーキテクチャには、JSON.stringifyを処理するための組み込み機能がcontentTypeとして含まれていることがわかっていますが、状況は少し異なるため、これは将来の誰かに役立つかもしれません。時間を節約できたと思います。

私のhttpリクエストは異なるサブドメインでIBM(AS400環境)からのCGI APIによって処理されているため、これらのリクエストはクロスオリジン、つまりjsonpです。私は実際にjavascriptオブジェクトを介して私のajaxを送信します。これが私のajax POSTの例です。

 var data = {USER : localProfile,  
        INSTANCE : "HTHACKNEY",  
        PAGE : $('select[name="PAGE"]').val(), 
        TITLE : $("input[name='TITLE']").val(), 
        HTML : html,
        STARTDATE : $("input[name='STARTDATE']").val(), 
        ENDDATE : $("input[name='ENDDATE']").val(),
        ARCHIVE : $("input[name='ARCHIVE']").val(), 
        ACTIVE : $("input[name='ACTIVE']").val(), 
        URGENT : $("input[name='URGENT']").val(), 
        AUTHLST :  authStr};
        //console.log(data);
       $.ajax({
            type: "POST",
           url:   "http://www.domian.com/webservicepgm?callback=?",
           data:  data,
           dataType:'jsonp'
       }).
       done(function(data){
         //handle data.WHATEVER
       });

2
この質問にさらに知識を追加していただきありがとうございます。満足のいく答えはすでに与えられていましたが、私はあなたの意見を賛成しました。
Redsandro 2016

1

これをasp.netに送り返し、request.form []のデータが必要な場合は、コンテンツタイプを "application / x-www-form-urlencoded; charset = utf-8"に設定する必要があります。

元の投稿はこちら

次に、データ型を取り除きます。戻りが予期されない場合、POSTは約4分間待機してから失敗します。こちらをご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.