我使用Play!斯卡拉2.4和我有幾個簡單的例子類像這樣的:是否有可能重寫play.api.libs.json寫入選項的方式?
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":"[]"}
,因爲我想)。
爲了使測試通過,我能做些什麼?
感謝您的回覆,我知道這樣做的方式,但在我的應用案例類包含更多的領域,我有很多案例類(對不起,我的問題不清楚)。這就是爲什麼我正在尋找一種通用的方式,以便不重寫每個作家......你能解釋一下爲什麼對於一個有更多字段的對象來說不那麼麻煩嗎? – Simon
@Simon我用一個例子更新了我的答案。如果這些case類的'Writes'正在使用'Json.writes [A]',那麼重寫它們是不可避免的。 –
以下是使用'writeNullable'的宏的相關部分,它將忽略'Writes [Option [A]]'並執行它自己的操作:https://github.com/playframework/playframework/blob/ec9de32196ae967619251cf6d61442fb27c88fe0/framework/ src/play-json/src/main/scala/play/api/libs/json/JsMacroImpl.scala#L176-L179 –