是否可以覆盖play.api.libs.json写入选项的方式?

是否可以覆盖play.api.libs.json写入选项的方式?,json,scala,playframework,Json,Scala,Playframework,我工作和玩耍!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 => Js

我工作和玩耍!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”:“[]”}


我该怎么做才能通过这次考试

您需要将
a脚本更改为下面的脚本,以添加
“a”:
部分:

implicit val aWrites: Writes[A] = new Writes[A] {
  override def writes(o: A): JsValue =
    Json.obj("a" -> Json.toJson(o.a))
}

编辑:使用
Writes
对象的
apply
方法更清晰,对Scala来说是一个更好的实践,因此我建议您使用@m-z的答案。

使用
Json.Writes
宏是不可能的,因为它是专门处理
选项
来使用
可读空[B]
。这意味着您需要使用组合符来定义
写入[A]
。不幸的是,为只有一个字段的对象定义
写入
,比为多个字段的对象定义要麻烦一些

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}

感谢您的回复,我知道这样做的方法,但在我的应用程序中,案例类包含更多的字段,我有很多案例类(很抱歉,我的问题不清楚)。这就是为什么我在寻找一个通用的方法,以避免重写每一个作家。。。你能给我解释一下,为什么一个有更多字段的对象不那么麻烦吗?@Simon我用一个例子更新了我的答案。如果您为这些案例类编写的
代码当前正在使用
Json.Writes[A]
,那么重新编写它们是不可避免的。下面是宏中使用
writeNullable
的相关部分,它将忽略
写入[Option[A]]
,并执行自己的操作:好的,很遗憾。。。您可能知道另一个库,它允许为带有选项的案例类编写自定义json编写器吗?正如我告诉m-e的,我正在寻找一个通用解决方案,很抱歉,我的问题不清楚。