jQueryのAjaxで多次元配列をPOST

params = {
  A: {
    a1: 'a1',
    a2: 'a2'
  },
  B: 'b'
}
jQuery('#content').load('/some/path', params);

なんてコードがあるとします。そもそもjQueryのloadとはprototype.jsにおけるAjax.Updaterのようなもので、上記で言えば#contentを/some/pathの内容に置き換える、というものです。

このloadはパラメータを省略した場合はGET、付与した場合はPOSTリクエストとなるのですが、上記のようにパラメータに多次元配列を指定した場合正しく処理されなかったのでとりあえず対策法をメモ。

ちなみにPHPに上記をダンプした場合の結果ですが、

Array(
  [A] => [object Object]
  [B] => b
)

このように多次元ではなく、あくまで1次元の配列になってしまいます。そこでどうしたかというと、まずは上記を文字列でやってみることにしました。

params = 'A[a1]=a1&A[a2]=a2&B=b';

これならうまくいくだろうと思ったら、とんでもないことに。FirebugでPOSTした内容をみたら、

0	A
1	[

こんな感じで1文字ずつに分割されて送られてました。これでは使い物になりません。上記のような文字列はGETで送信する場合のみ有効で、POSTの場合は1次元のハッシュにするしかないようです。

そこで考え付いたのが、

params = {
  'A[a1]': 'a1',
  'A[a2]': 'a2',
  'B': 'b'
}

上記のように、無理やりハッシュのキーを配列形式にしてみました。

Array
(
    [A] => Array
        (
            [a1] => a1
            [a2] => a2
        )

    [B] => b
)

とりあえずうまくいってるみたい。なんというバッドノウハウ