Play20 で lift-json を使う


ドメインオブジェクトからJSONへのアンマーシャルがだるい - ikeike443のブログ

はい、だるいので、実は productFormatN というお手軽 Read/Write=Format 定義メソッドがあります
ドキュメントにまだ載ってないみたい。


使い方


ただ、ikeikeさんの例だと Userクラスが再帰的になっているためか、StackOverflow しました。。。



で、思ったのですが、Scala には Lift の遺産(死んでません) lift-json があるのです。
lift-json の使い型はこちら lift-json リファレンス - tototoshiの日記
いちいち Format 書く必要ないし、play.api.libs.json よりイケてますから、こっちを使いたい。




というわけで、Play20 で lift-json を使えるようにして、モジュール化しました。
tototoshi/lift-json-play-module · GitHub


設定

val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings(
  resolvers += "tototoshi.github.com maven-repo/releases" at "http://tototoshi.github.com/maven-repo/releases",
  libraryDependencies ++= Seq(
    "com.github.tototoshi" %% "lift-json-play-module" % "0.1"
  )
)


mixin してお使いください。

import com.github.tototoshi.play2.json.LiftJson
import net.liftweb.json._

case class Person(id: Long, name: String, age: Int)

object Application extends Controller with LiftJson {

  implicit val formats = DefaultFormats

  def get = Action { implicit request =>
    Ok(Extraction.decompose(Person(1, "ぱみゅぱみゅ", 19)))
  }

  def post = Action(liftJson) { implicit request =>
    // request body が lift-json の JValue になる
    val jval = request.body
    val pamyu: Person = jval.extract[Person]
    Ok(pamyu.name)
  }

}