2011年7月6日水曜日

PHP Services_JSON について

PHP5.1.6が動いているサーバとjQueryとの間でJSONでやり取りをさせたときにはまった内容。

まず、PHP5.3とjQueryではPHP内のjson_encodeを利用してJSONデータを作成してブラウザに送り込んで問題なかったのだが、PHP5.1.6+IE+jQueryで問題発生。(FFは問題なし)

json_encodeが利用できるのは、PHP5.2以降か、PHP5.1の場合はPECLで入れたときのみなので、サーバがPHP5.1.6でサーバ内をいじれない環境だったので、以前使ったことのあるServices_JSONでjson_encodeの代わりをさせようとした。
ところが、JSONの受信時にIEではダウンロードのダイアログが出てしまいうまく受け取れない。

Services_JSONが勝手にhttpヘッダーをはいていたことが判明。
詳しくは下記サイト。

http://rd.uniba.jp/blog/2010/03/26/

IEでは正式なContent-type: application/jsonを受け付けてくれないようで。
httpヘッダーをはかないように、encode()メソッドの代わりにencodeUnsafe() を利用することにして一段落。


そしてさらに、IEだとJSONのデータ内の<>'"&などもエスケープしてやる必要がある。(左の5つの内どれだけ変換してやる必要があるかは調べてない。とりあえず5つとも変換してやればうまくいった。)


そこでServices_JSONに少し手を加える。
json_encode($obj, JSON_HEX_TAG|JSON_HEX_APOS|JSON_HEX_QUOT|JSON_HEX_AMP);を実行したときのデータを下にこんな感じのを入れてやる。



case $ord_var_c == 0x3C:
//<
$ascii .= '\u003C';
break;
case $ord_var_c == 0x3E:
//>
$ascii .= '\u003E';
break;
case $ord_var_c == 0x27:
//'
$ascii .= '\u0027';
break;
case $ord_var_c == 0x22:
//"
$ascii .= '\u0022';
break;
case $ord_var_c == 0x26:
//&
$ascii .= '\u0026';
break;


う~んべたべたでぜんぜんスマートじゃない。


がとりあえず動くようになった。



0 件のコメント: