ikeike443のブログ

ソフトウェアビジネスに関心がある系のブログ

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

このページの説明を見ててあーダルいなと思いました。

import play.api.libs.json._

case class User(id: Long, name: String, friends: List[User])
  implicit object UserFormat extends Format[User] {
    def reads(json: JsValue): User = User(
      (json \ "id").as[Long],
      (json \ "name").as[String],
      (json \ "friends").asOpt[List[User]].getOrElse(List()))
    def writes(u: User): JsValue = JsObject(List(
      "id" -> JsNumber(u.id),
      "name" -> JsString(u.name),
      "friends" -> JsArray(u.friends.map(fr => JsObject(List("id" -> JsNumber(fr.id), "name" -> JsString(fr.name))))))) 
  }

上記みたいなコードを毎回書くのだるい。

特にアンマーシャルはダルいので、下記みたいなコード書いてみた。


こう呼び出します。as("application/json")がダサいなあ。もっといい方法あれば教えて下さい。

case class User(id: Long, name: String, friends: List[User])
def sendJson() = Action {
    val peter = User(2, "peter",  List())
    Ok(toJson(peter)).as("application/json")
}


マーシャルは、まあまた今度考えよ。。

追記

totoshiさんがlift-jsonを使ってもっとイージーに書けるようにしてくれました。
あざーす。
http://d.hatena.ne.jp/tototoshi/20120526/1338032893