如何在来自 Scala/Play 框架的 JSON 响应中 return BigDecimal 的 2 个小数点

How to return 2 decimal points for BigDecimal in JSON response from Scala/Play Framework

这是我的案例class。

case class DecimalWrapper(money: BigDecimal, type: String)

object DecimalWrapper {
    implicit val decimalWrapperMarshaller = Json.format[DecimalWrapper]
}

当尝试做 Json.toJson(DecimalWrapper(2, "whole sale")) 时 returns

{
   "money": 2
   "type": "whole sale"
}

我希望 return 的货币字段是 2.00

我找不到一种方法来指定自定义序列化程序始终 return 2 个小数点并四舍五入 HALF_UP。

有人好心帮忙吗?

问候 锡

您可以手动编写您的 Writes。 类似于:

implicit val myWrites= new Writes[DecimalWrapper] {
  def writes(a: DecimalWrapper): JsValue = Json.obj(
    "money" -> a.money.setScale(2, RoundingMode.HALF_UP).toString(),
    "type" -> a.`type`
  )}

可能看起来更复杂,但如果您打算在整个应用程序中重用写入逻辑,那么为 BigDecimal 定义一个单独的 writes 是个好主意。需要注意的一件事是您必须显式使用它,不能将其声明为隐式,因为已经为 BigDecimal.

定义了隐式写入
val decimalWrites = new Writes[BigDecimal]{
  def writes(o: BigDecimal): JsValue = JsString(o.setScale(2, RoundingMode.HALF_UP).toString())
 }

implicit val decimalWrapperWrites: Writes[DecimalWrapper] = (
  (JsPath \ "money").write[BigDecimal](decimalWrites) and
  (JsPath \ "type").write[String]
)(unlift(DecimalWrapper.unapply))