uneval(obj) は obj の JSON ではない件
JSON がなかなか楽しいので,CGI へのデータの受け渡しも JSON でやってしまうことにした。
最初は JavaScript のオブジェクトを
encodeURIComponent(uneval(obj))
みたいな感じで POST していたんだけど,これだと CGI(Ruby)側で JSON.parse に失敗する。どうやら,uneval の出力は厳密には JSON フォーマットに準拠しないとのことらしい。紛らわしいったらありゃしない…。しかも Safari は uneval をサポートしていないようなので uneval は,Macユーザの私にはあまり嬉しくない。
色々調べた結果 json2.js を使って
encodeURIComponent((JSON.stringify(obj))
するのが正解ということが分かった。まとめると
Ruby to JavaScript => var jsobj = eval('(' + obj.to_json + ')'); JavaScript to Ruby => rbobj = JSON.parse(JSON.stringify(obj))
で,オブジェクトを異なる言語間でシリアライズして変換していることになる。なかなか楽しいぞ。こうなると C++ の JSON パーサが欲しくなるところ。
JavaScript を使ったプログラミングも徐々にレバレッジが効いてくるというか,スケールするというか,徐々に加速してきた。いい感じだ!