Play框架 - 将参数传递给Writes和Reads

时间:2015-12-16 17:57:09

标签: json scala playframework-2.0

有没有办法将参数传递给Writes,我可以控制它们编写JsValue的方式?

这就是现在的样子:

implicit val myClassWrites = new Writes[MyClass] {
    override def writes(l: MyClass): JsValue = Json.obj("a" -> l.a, "b" -> l.b)
}

但我想做这样的事情:

implicit val myClassWrites = new Writes[MyClass] (extended: Option[Boolean]) {
    override def writes(l: MyClass): JsValue = {
          extended match{
             case true => //do something
             case false => //do something else
          }
    }
}

有没有一种优雅的方法来实现这一目标?或类似的东西?

我管理过用这样的Reads(删除隐式)来实现这个需求:

def myClassReads(c: String) : Reads[MyClass] = (
  Reads.pure(c) and
  (JsPath \ "a").read[String] and
  (JsPath \ "b").read[String]
) (MyClass.apply _)

然后当我想使用读取时(通常在控制器中,当我想验证请求的主体时)我这样做:

request.body.validate[MyClass](MyClass.myClassReads("foo")).fold(
    errors => //
    myClass=> // do domething
)

所以写作仍然是一个谜。

1 个答案:

答案 0 :(得分:3)

您可以使用implicit参数执行此操作。请参阅以下代码:

case class Extended(b: Boolean)

object MyClass {

 implicit def MyClassWrites(implicit extended: Extended): Writes[MyClass] = new Writes[MyClass] {
     def writes(l: MyClass) =
          if (extended.b) JsString("foo")
          else JsString("bar")
    }
}

然后像这样使用

implicit var extd = Extended(true)

println(Json.toJson(myClass)) // foo

extd = Extended(false)

println(Json.toJson(myClass)) // bar