jQueryの小ネタです。
浅いシリアライズと深いシリアライズ
jQuery の $.param() には、2通りのシリアライズの形式があります。
$.param(obj [, traditional])
jQuery1.4 以降は シリアライズの方法を第2引数(オプション)で指定可能です。
traditional
Type: Boolean
A Boolean indicating whether to perform a traditional "shallow" serialization.
「従来の"浅い"シリアライズを行うかどうかを指定する」引数で、デフォルトではfalseです。
true にすると、1階層までの値をシリアライズし、falseにすると再帰的に "深く" までシリアライズします。
例
上記リンクと同じデータで例を示します。
$.param({a: [2, 3, 4]}); // "a[]=2&a[]=3&a[]=4"
$.param({a: [2, 3, 4]}, true); // "a=2&a=3&a=4"
$.param({a: {b: 1, c: 2}, d: [3, 4, {e: 5}]});
// "a[b]=1&a[c]=2&d[]=3&d[]=4&d[2][e]=5"
$.param({a: {b: 1, c: 2}, d: [3, 4, {e: 5}]}, true);
// "a=[object+Object]&d=3&d=4&d=[object+Object]"
Ajaxでパラメータを送信する場合、サーバ側がdeepな形式に対応していない場合はtraditionalにtrueを指定する必要があります。
(私は最初これに気づかないで、仕方なく文字列に置換かけて一時しのぎしていました)
注意
jQuery 1.8 以降、$.param() は jQuery.ajaxSettings.traditional の値を使用しないので、$.param() で明示的に traditional の値を指定したほうが良いそうです。
参考リンク