如何在Scala / Play Framework的JSON响应中为BigDecimal返回2个小数点

时间:2015-12-23 11:04:22

标签: json scala playframework bigdecimal

这是我的案例类。

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

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

当试图做Json.toJson(DecimalWrapper(2,"整个销售"))时,它返回

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

我希望它返回的内容是 2.00

我无法找到一种方法来指定自定义序列化器,以便通过舍入HALF_UP始终返回2个小数点。

有人请帮忙吗?

此致 锡

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您可以手动编写您的写入。 类似的东西:

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`
  )}