web-dev-qa-db-ja.com

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

誰かが簡単な方法で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[]: []に変換されることです。

164
Redsandro

オブジェクトをJSONにシリアライズするには JSON.stringify を使用し、次にサーバーがJSONを認識できるようにcontentTypeを指定する必要があります。これでうまくいくはずです。

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

JSONオブジェクトは、JavaScript 1.7/ECMAScript 5以降をサポートするブラウザでネイティブに利用可能です。従来のサポートが必要な場合は、 json2 を使用できます。

241
mekwall

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

JSONを投稿するには、 JSON.stringify を使って自分でそれを文字列化し、processDataオプションをfalseに設定する必要があります。

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

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

26
Bergi

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

私の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
       });
5
yardpenalty

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

元の投稿 はこちら

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

1
Tod