jQueryのajax処理で
jQuery-1.4.2を使っていて生じた問題についてのメモ。
jQueryを使ってajax処理し、結果をjsonで受け取るなんていうのはよくある話。普段から使っていた処理なのに、今回どうにもこうにもはまってしまったのでメモ。
ajaxメソッドの引数のオブジェクトで{success:hoge,error:fuga}と成功時と失敗時でそれぞれ関数を定義しておいた。基本的にはhoge関数が起動してその中で処理が行われ、fuga関数自体が起動されることはまずないはず、と踏んでいた。しかしどうしてもhoge関数が呼ばれず、fuga関数ばかりが呼ばれてしまう。理由がわからない。
まずfuga関数の第2引数をダンプしてみた。「parseerror」の表示。つまりサーバから送られてきたレスポンスがjsonオブジェクトになっていない(フォーマットが間違っている)というエラーだ。最初はてっきり「あ、またヘッダつけるの忘れた」と思い、PHP側で以下の1行を追加してみたが結果は変わらない。
header(‘Content-Type: application/json; charset=utf-8′);
どうにもこうにも原因がわからないので、根本的に「JavaScriptのオブジェクトってこのフォーマットであってたっけ」みたいなことも考えてみた。PHP側からの出力は最初、以下のようにしていた。
{result:0, message:’エラー’}
JavaScriptとしては正常なオブジェクトのように思うのだが、jQueryはこの形式がお嫌いのようだ。まず問題を簡単にするために[]とか{}とかで返してみた。この場合は正常にパースしてくれる。次に[1]や[1,2]としてみた。これもOK。そして[‘1′]。これはパースエラーになった。もしやと思い[“1″]。これはセーフ。つまりシングルクォーテーションでくくるのはダメらしい。マジかよ。
次にオブジェクトをチェック。{“result”:0}はOKだけど{result:0}はNG。つまり添字になる部分もダブルクォーテーションでくくれってことになっている(シングルクォーテーションの場合もNGだった)。
結果として、以下の文字列で返すことで正常にパースできるようになった。
{“result”:0, “message”:”エラー”}
なんだか解せないが、とりあえずヨシとする。
2010/09/13 at 2:20 PM
いつも拝見させていただいてます。
以前同じ問題で悩んだことがありますが、
PHP5以降なら、配列をjson_encode()してechoすれば綺麗に取得できますね。
しかしjson_encodeだとPHPでの「NULL」は、JSON上で「null」という文字(文字列でない)になるので、僕の場合これがなんか気持ち悪いのでPHPの時点でNULLを””(空文字)にしてます。
2010/09/13 at 10:52 PM
json_encodeをうまく使えるような仕様を整えたいと思います。基本的に出力はすべてテンプレート化していてそれと整合性を持たせたいので、どういうふうにすればよいか考えなきゃ、ですね。