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

时间:2016-02-03 01:48:22

标签: json scala playframework

我和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":"[]"}。) 为了让这个测试通过,我该怎么办?

2 个答案:

答案 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的答案。