我与Play合作!Scala 2.4,我有几个像这样的简单案例类:
case class A(a: Option[String])
当该选项为空时,我想重写Json.toJson(A)的工作方式。
这是我所做的:
implicit val aWrites: Writes[A] = Json.writes[A]
implicit def ow[T](implicit w: Writes[T]): Writes[Option[T]] = Writes {
case None => JsString("[]")
case Some(t) => Json.toJson(t)
}
Json.toJson(A(a = None)) mustBe Json.parse("""{"a":"[]"}""")
但是它仍然像往常一样解析类(即{}
不是{"a":"[]"}
我想要的那样)。
我要怎么做才能通过测试?
使用Json.writes
宏是不可能的,因为它是专门Option
为use编写的readNullable[B]
。这意味着您将需要使用组合器进行定义Writes[A]
。不幸的是,Writes
为一个只有一个字段的对象定义要比拥有一个字段的对象麻烦得多。
implicit val aWrites: Writes[A] = Writes(a => Json.obj("a" -> a.a))
scala> Json.toJson(A(None))
res8: play.api.libs.json.JsValue = {"a":"[]"}
具有多个字段的示例:
import play.api.libs.functional.syntax._
import play.api.libs.json._
case class A(a: Option[String], b: Int)
implicit val aWrites: Writes[A] = (
(__ \ "a").write[Option[String]] and
(__ \ "b").write[Int]
)(unlift(A.unapply))
scala> Json.toJson(A(None, 10))
res0: play.api.libs.json.JsValue = {"a":"[]","b":10}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句