【问题标题】:How to return 2 decimal points for BigDecimal in JSON response from Scala/Play Framework如何在来自 Scala/Play 框架的 JSON 响应中为 BigDecimal 返回 2 个小数点
【发布时间】:2015-12-23 11:04:21
【问题描述】:

这是我的案例课。

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

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

当尝试执行 Json.toJson(DecimalWrapper(2, "whole sale")) 时,它会返回

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

我希望它返回的是 2.00 用于货币领域。

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

有人帮忙吗?

问候 锡

【问题讨论】:

  • type 是 Scala 中的保留字,因此您的示例无法编译

标签: json scala playframework bigdecimal


【解决方案1】:

可能看起来更多,但如果您打算在整个应用程序中重用该写入逻辑,最好为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))

【讨论】:

  • 感谢 Josphpconley。您提供的代码有效,但是,它返回一种字符串类型,例如“2.00”而不是 2.00。在 Java 中,我可以为 Jackson 编写一个自定义序列化程序,并使用 Spring 全局注册它。在 Scala/Play 框架中可以用同样的方式完成吗?
【解决方案2】:

您可以手动编写您的 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`
  )}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 2016-08-17
    • 2018-08-01
    • 1970-01-01
    • 2016-03-31
    相关资源
    最近更新 更多