有没有办法将参数传递给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
)
所以写作仍然是一个谜。
答案 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