Возможно иметь класс, который выглядит следующим образом:
case class Amount(value: Int)
case class Data(insurance: Option[Amount], itemPrice: Amount)
Если insurance = None
, он должен получить значение по умолчанию waived: true
Например:
Data(Some(123),100).asJson
// output
{
"insurance": {
"value": 123
},
"price": 100
}
And when no Insurance is opted for:
Data(None,100).asJson
// output
{
"insurance": {
"waived: true
},
"price": 100
}
Как можно добиться этого мелкозернистого контроля?Я пробовал различные трюки с forProduct2
и mapJsonObject
, но не мог заставить его вести себя правильно:
implicit val testEncoder = deriveEncoder[Option[Amount]].mapJsonObject(j => {
val x = j("Some") match {
case Some(s) => // need to convert to [amount -> "value"]
case None => JsonObject.apply(("waived",Json.fromBoolean(true)))
}
x
})
Это может легко получить часть waived:true
, но я не представляю, как обращаться с Some(s)
дело.