如何在来自 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))
这是我的案例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))