我和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":"[]"}
。)
为了让这个测试通过,我该怎么办?
答案 0 :(得分:2)
这不可能使用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}
比有更多字段的对象稍微麻烦一点。
#nav {
position: fixed;
height: 50px; width: 50px;
display: block;
background-color: #000;
}
多个字段的示例:
<div id="nav">icon</div>
答案 1 :(得分:0)
您需要使用下面的"a":
更改implicit val aWrites: Writes[A] = new Writes[A] {
override def writes(o: A): JsValue =
Json.obj("a" -> Json.toJson(o.a))
}
部分:
apply
编辑:使用Writes
mpfr
对象的mpfr
方法更清晰,更适合Scala,所以我建议您使用@ m-z的答案。