end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転します

jQuery.ajax()でlistやhashをpostするとkey名称に[]が付加?

次のようなsrcでjQuery.ajax()を使い、構造体(リストや配列)データをpostすると、パラメータ名が変更されるみたい([]が付加)。

test_ajax_req: function(){
    var req_data = {
        scalar_val : 'ABC',
        list_val: [1,2,3],
        hash_val: {'A':'a','B':'b'}
    };
    var this_obj = this;
    $.ajax({url: 'TestServer.pl',
            type: 'POST',
            data: req_data,
            success: function(ret_json,txt_status,xhr){
            },
            error: function(ret_json,txt_status,xhr){
            }
           });
},
scalar_val=ABC&list_val%5B%5D=1&list_val%5B%5D=2&list_val%5B%5D=3&hash_val%5BA%5D=a&hash_val%5BB%5D=b
つまり↓これ
hash_val[A]	a
hash_val[B]	b
list_val[]	1
list_val[]	2
list_val[]	3
scalar_val	ABC

ajax()のオプションにある traditional:true オプション

http://api.jquery.com/jQuery.ajax
http://api.jquery.com/jQuery.param

jQuery.param()のドキュメントにもありますが、このキー名変更は、再帰的にシリアライズする為にjquery v.1.4<->1.5で仕様変更されたらしく、ajax()に traditional:true オプションを加えると、次のようなpost dateになり、ハッシュ値を送信することができません。

scalar_val=ABC&list_val=1&list_val=2&list_val=3&hash_val=%5Bobject+Object%5D
つまり↓これ
hash_val	[object Object]
list_val	1
list_val	2
list_val	3
scalar_val	ABC

jquery.json.js の $.toJSON() でシリアライズするのも良いのでは?

先程のajax({traditional:true})でキー名変更は防げますが、一方、hash値は送信できない為、いっそのこと jquery.json.js の $.toJSON()でシリアライズしても良いのかも