Play! framework 2.xでJSONを扱う方法をいくつか
Webサイト作ってると、JSONを扱うことが多い。なので、Play! frameworkで、ScalaのオブジェクトからJSON文字列に、あるいはその逆をやりたいよね、と(特に前者)。
そんな今回はObject -> JSONの方法をいくつかまとめてみた。
環境は Play 2.1.1。そのうち2.2にアップグレードしようと思うけど。
ちなみに Scala Advent Calendar 2013 の 12日目の記事ですら。
あまりおすすめじゃない方法
使いたくない(Format) or 使えない(Jerkson)方法
JSONを扱う方法?え?Play!のサイトに書いてあるじゃん、と思うかもしれない。確かにそうなんだけど、Formatを定義するの面倒だし、何かいい方法がないかなと思って調べてみた。
例えば、SOのこの質問(見覚えのある人からの回答が付いてる)。これもやっぱりFormatを定義する方法。
こちらのSOの回答の1つでは、Play 2ならJerksonを使って簡単に出来るとのこと。
import com.codahale.jerksHon.Json._ generate(obj);
ただ、Play 2.1ではJerksonは使われていない。Jerksonがもうメンテされていないのが原因っぽい。
Jackson
Jacksonでも割と簡単に出来る。が・・・、Javaのライブラリなので、コードが冗長・・・(→コード例)
Play 2.1でのおすすめ方法、多分
play-json4s (使ったこと無いけど・・・)
tototoshiさん作成のplay-json4sは良さそう。あまりメンテしてないのかなと思って導入を見送っちゃったけど、Play! 2.2に対応しているし、使っとけば良かった・・・
このモジュールに関しては、詳しくはご本人へどうぞ。
lift-json
老舗フレームワークであるLiftで使われているJSONライブラリ(こちら)。単体でも使える。詳しくはグーグル先生に聞いて下さい。
JSON Macro Inception
Scala 2.10のマクロを使った新機能がこれ。case classとかだと簡単にJSONに出来るよ。
でも、やっぱりFormat[T] / Writes[T] なのか?
Inception使うにしても裏では実際はWritesが使われているので、この辺の知識は避けて通れないのかも・・・でも、Play 2.0の時から変更があって少し便利になっている気がする。
この辺を参照。
具体例、を書こうかと思ったけど、お腹の調子が悪いので省略。
まとめ
普段PHPも使ってるんだけど、json_encode($obj) って出来るのは便利だなぁと思う。でも、Scalaも言語機能とかライブラリとかが徐々に充実してきて便利になってるので、今後に期待。