jQueryのajax処理で

2010/09/11 | JavaScript/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”:”エラー”}

なんだか解せないが、とりあえずヨシとする。

2件のコメント

  1. ken :

    いつも拝見させていただいてます。
    以前同じ問題で悩んだことがありますが、
    PHP5以降なら、配列をjson_encode()してechoすれば綺麗に取得できますね。
    しかしjson_encodeだとPHPでの「NULL」は、JSON上で「null」という文字(文字列でない)になるので、僕の場合これがなんか気持ち悪いのでPHPの時点でNULLを””(空文字)にしてます。

  2. かおるん :

    json_encodeをうまく使えるような仕様を整えたいと思います。基本的に出力はすべてテンプレート化していてそれと整合性を持たせたいので、どういうふうにすればよいか考えなきゃ、ですね。

コメントを残す


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net