I'm sure the problem comes from .getOrElse(JsNull)
I have successfully compiled this code:
import play.api.libs.json.{JsNull, Json, JsValue, Writes}
case class Cost(cost: Option[Double])
case object Cost {
def writes = new Writes[Cost] {
override def writes(r: Cost): JsValue = {
Json.obj(
"cost" -> r.cost.map(Json.toJson(_))
)
}
}
}
and analyzed the conclusion:
scala> Cost(Some(5))
res2: Cost = Cost(Some(5.0))
scala> Json.toJson(res2)(Cost.writes)
res5: play.api.libs.json.JsValue = {"cost":5}
Looking for the source of the problem, you can check out a couple of additional solutions, assuming a write function:
val cost = r.cost.map(t => Json.toJson(t))
Json.obj(
"cost" -> cost
)
Option cost getOrElse, ( ), :
cost.getOrElse[JsValue](JsNull)
cost.getOrElse(JsNull).asInstanceOf[JsValue]
sbt :
[error] (...) type mismatch;
[error] found : Object
[error] required: play.api.libs.json.Json.JsValueWrapper
SBT.