jQuery.getでtypeを指定しないと、MIME-Typeによって挙動が変わってしまう。

(jQuery1.4.2)
ある日、JSONテキストを受け取ってevalする処理がエラーを吐くようになった。こういうコード。

jQuery.get('/foo.json',
           function(json) {
               var foo = eval('(' + json + ')');
           });

思い当たるのは、Content-Typeがtext/plainだったのをapplication/jsonに変更したこと。
実際にそれが原因だったのだけれども。

/* MIME-Type: text/plain       */jQuery.get('/foo.json', function(json) {typeof json == 'string';});
/* MIME-Type: application/json */jQuery.get('/foo.json', function(json) {typeof json == 'object';});

/foo.jsonMIME-Typeがtext/plainだとコールバックに渡ってくるのは文字列なんだけども、
application/jsonだとオブジェクトが渡ってきた。(それを更にevalしちゃってたのでエラーになっていたという話)


安直にevalを外すという修正をしてしまうと対象リソースのMIME-Typeに左右されるようになってしまうので、getJSONに統一するようにした。
getJSONは対象リソースがJSONだと明示するメソッドで、

/* MIME-Type: text/plain       */jQuery.getJSON('/foo.json', function(json) {typeof json == 'object';});
/* MIME-Type: application/json */jQuery.getJSON('/foo.json', function(json) {typeof json == 'object';});

のように、MIME=Typeがどうなっていようとコールバックにはオブジェクトが渡ってくる。


ってかこれは

/* MIME-Type: text/plain       */jQuery.get('/foo.json', function(json) {typeof json == 'object';}, 'json');

のようにjQuery.getにタイプ'json'を渡してあげるのと同じことなんだけどね。
毎回'json'を渡すよりは、getJSONが用意されてるんだからそっち使った方が良いかなーと。