2011-07-05 26 views
54

なぜ以下のコードでJSON形式の代わりにCity=Moscow&Age=25というデータが送信されたのですか?jQueryでJSONデータを送信

var arr = {City:'Moscow', Age:25}; 
$.ajax(
    { 
     url: "Ajax.ashx", 
     type: "POST", 
     data: arr, 
     dataType: 'json', 
     async: false, 
     success: function(msg) { 
      alert(msg); 
     } 
    } 
); 
+2

dataTypeは返されたもので、送信されるものではありません! – Gal

+0

データの前に 'dataType'を入れてみてください。 – daGrevis

+1

'data'が' processData:false'をクエリー文字列形式に変換するのを防ぐためです。 http://api.jquery.com/jquery.ajax/#sending-data-to-server – Paul

答えて

142

リクエストのコンテンツタイプを指定していないか、JSONリクエストを正しく指定していないためです。ここではJSONリクエストを送信するための正しい方法です。注目すべき

var arr = { City: 'Moscow', Age: 25 }; 
$.ajax({ 
    url: 'Ajax.ashx', 
    type: 'POST', 
    data: JSON.stringify(arr), 
    contentType: 'application/json; charset=utf-8', 
    dataType: 'json', 
    async: false, 
    success: function(msg) { 
     alert(msg); 
    } 
}); 

物事:ネイティブと内蔵に近代的なブラウザでJSON文字列にjavascriptオブジェクトを変換するJSON.stringify方法の

  • 使い方。あなたは古いブラウザをサポートしたい場合は、サーバーへ
  • dataType: 'json'プロパティは、応答のために使用されているJSONリクエストを送信する意思を示すためにcontentTypeプロパティを使用して、要求のコンテンツタイプを指定json2.js
  • 含める必要がありますサーバーから期待するタイプ。 jQueryはと推測してと推定され、サーバーからContent-Typeというレスポンスヘッダーがあります。したがって、多かれ少なかれHTTPプロトコルを尊重し、あなたのリクエストにContent-Type: application/jsonで応答するWebサーバーを持っている場合、dataTypeプロパティを指定する必要がないように、jQueryは自動的にsuccessコールバックへのjavascriptオブジェクトへの応答を解析します。

には注意が観光:

  • あなたはarr配列ではありません呼んでいるもの。これはプロパティ(CityAge)を持つjavascriptオブジェクトです。配列は、javascriptで[]と表示されます。たとえば、[{ City: 'Moscow', Age: 25 }, { City: 'Paris', Age: 30 }]は2つのオブジェクトの配列です。
+0

こんにちは私は自分のコードでテストしましたが、動作しませんhttp://pastie.org/pastes/7975866/テキストなぜですか? – Michelangelo

+0

JavaScriptの技術的なオブジェクトは単なる連想配列です。そのようにするのは混乱しますが、JavaScriptでオブジェクトを配列として呼び出すことは間違いではありません。 詳細については、[JavaScriptのデータ構造](http://www.i-programmer.info/programming/javascript/1441-javascript-data-structures-the-associative-array.html) – Nadav

8

デフォルトでは、jQueryはdataパラメータとして渡されたオブジェクトを$.ajaxにシリアル化します。これは、$.paramを使用して、データをクエリ文字列に変換します。 $.ajaxのためのjQueryのドキュメントから

[data引数は]クエリ文字列に変換され、そうでない場合は、すでに文字列

あなたはJSONを送信する場合は、あなた'LLされますそれを自分でエンコードする必要があります:JSON.stringifyは、現代のブラウザにのみ存在することを

data: JSON.stringify(arr); 

注意。従来のサポートについては、json2.js

0

を参照してください。URIがPOSTリクエストの名前の値のペアをデフォルトで読み取ることができるように、シリアル化されます。 processData:falseをparamsのリストに設定してみることもできます。それが助けになるか分からない。

0

正しいコンテンツタイプを設定し、オブジェクトを文字列化する必要があります。

var arr = {City:'Moscow', Age:25}; 
$.ajax(

      { 
       url: "Ajax.ashx", 
       type: "POST", 
       data: JSON.stringify(arr), 
       dataType: 'json', 
       async: false, 
       contentType: 'application/json; charset=utf-8', 
       success: function(msg) { 
        alert(msg); 
       } 
      } 
     ); 
+0

これは動作しませんまったく。投稿変数はありません。 – Michelangelo

+0

@ミケランジェロあなたはそれを間違ってやった。 –

3

私はJSONを投稿するための短い便利機能を書いた。

$.postJSON = function(url, data, success, args) { 
    args = $.extend({ 
    url: url, 
    type: 'POST', 
    data: JSON.stringify(data), 
    contentType: 'application/json; charset=utf-8', 
    dataType: 'json', 
    async: true, 
    success: success 
    }, args); 
    return $.ajax(args); 
}; 

$.postJSON('test/url', data, function(result) { 
    console.log('result', result); 
}); 
関連する問題