prototype.js 1.4.0 pre6 でのJSONサポート

http://dev.conio.net/repos/prototype/pkg/

JSONサポートしたよ!つってたので期待して見たらダメダメだった。

普通xmlhttprequest(xhr)のresponseTextで取得した文字列からJavaScriptで使えるオブジェクトにしたい場合、

eval('var result = ' + result.responseText);

とやる必要があった。ここら辺をライブラリでラッピングしてくれてんのかなと思ってソースみたらevalJSONって関数が定義してあってキタコレ!と思ったら全然用途違ったよ!

  evalJSON: function() {
    var json = this.transport.getResponseHeader('X-JSON'), object;
    if (json) {
      try {
        object = eval(json);
      } catch (e) {
      }
    }
    return object;
  },

なにこれーResponseHeaderのX-JSONをオブジェクトに変換してるのかyp!んでもってFirefoxでエラーはきまくってる。理由はこのevalJSONがReadyState変更ごとに呼ばれて、getResponseHeaderでエラーと。そのうち対策されるだろうと

  evalJSON: function() {
    try{
      var json = this.transport.getResponseHeader('X-JSON'), object;
    } catch (e) {}

    if (json) {
      try {
        object = eval(json);
      } catch (e) {
      }
    }
    return object;
  },

とtry catchいれて対応。その後rails側のcontrollerで

  protected

  def json(obj)
    @headers['X-JSON'] = obj.to_json
  end

とかつくっといてJSON使って渡したいオブジェクトをheaderのX-JSONにいれた。これでJSONをシームレスに使えるようになるなぁ、って思ったらマルチバイト文字が入ると文字化けてしねるよp−q。そもそもresponse headerってマルチバイト文字OKだっけとかいろいろで結局responseTextをevalしたメソッド作るところに落ち着いたよ…。