« クロージャの使用例 in Text::Hatena | メイン | Safari 2.0.3でtextbox中のキャレットの位置の処理が変わった? »

JSONとContent-Type

サーバサイドからJSONを吐き出すときのContent-Typeなのですが、各ブラウザによって対応がちょっと違います。
下の表にまとめてみました。

×のところはeval中にエラーがでます。

Content-type WinIE Firefox Safari Opera(8.5)
text/javascript ×
text/javascript; charset=utf-8 ×
text/javascript; charset=utf8(utf-8の間違い) × ×
text/javascript+json ×
text/javascript+json; charset=utf-8 ×
text/html; charset=utf-8      


Safariでマルチバイトな文字を含む場合は、「charset=utf-8」があったほうがいいです。

Opera(8.5)はtext/javascriptだと根本的にだめみたいです。
Catalyst::View::JSONは「text/javascript+json」とかなっているんだけどどうするのが良いのでしょう。

さっきまで、間違えて「utf8」って書いてしまっていたんだけど、IE以外はうまく認識してくれますね。


確認は下のようなコードで行いました。prototype.jsのAjax.Requestをつかってます。

new Ajax.Request(
    "/foo",{
    method: "get",
    parameters: params,
    onComplete: function(originalRequest){
        try{
            eval("var ret="+originalRequest.responseText);
        }catch(e){alert(e);}
    }
});

トラックバック

この一覧は、次のエントリーを参照しています: JSONとContent-Type:

» JSON の response header from Nix::WebLab
XML ではなく JSON で GoogleMapAPI を利用していると Sa... [詳しくはこちら]

» ExtJSのJsonReaderを使うときは、 from Do I like programming?
JSONのレスポンスにちゃんとContent-Typeを設定してあげないと、エラーになるのねー あぁ、これ1時間ぐらいハマッたー \(^o^)/ ... [詳しくはこちら]

コメント

これってDOMを操作して script ノードを追加する場合の話でしょうか? XMLHttpRequest で responseText を eval する場合は Content-Type はなんであっても大丈夫な気がしているのですがどうなんでしょう?

あぁutf-8とかでマルチバイトが入っているとevalしてもうまく認識してくれないってわけですかね。

>utf-8とかでマルチバイト〜
と、Operaですね。
Opera 9は分からないですけど、Content-Typeを選ぶみたいです。

Safari 向けに charset=utf-8 を入れるようにした 0.06 をリリースしました。Opera 向けの正規表現をもらえれば Opera のときだけ text/html にするパッチをいれるのは問題ないです。

Operaの判別は
$c->res->content_type("text/html; charset=$encoding") if $c->req->user_agent =~ /Opera/;
でいけると思います。

del.icio.usのJSON Feedは
Content-Type: application/x-javascript; charset=utf-8
だな。これだとOperaでも動くみたいだ。

0.08 で application/x-javascript に対応しました。

> 0.08
確認しました。すべてMacですが、Safari Firefox Operaで正しく動作しました。
何度かリリースし直していただいてすみません。

text/*だとブラウザが何かしら行おうとするのでしょうか。

いえいえ、いまHackathon中なのでなんでも書くものがあれば歓迎です :)

コメントを投稿