2015-12-23 46 views
0

这是我的案例类。如何在Scala/Play Framework的JSON响应中为BigDecimal返回2个小数点

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为了钱场。

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

任何人请帮助吗?

问候 田

+0

'type'是Scala中的保留字,因此您的示例将不会编译 – josephpconley

回答

0

似乎更复杂,但它会是一个好主意,定义一个单独的writesBigDecimal如果你打算重用整个应用程序写入逻辑。有一点需要注意的是,你必须明确地使用它,你不能声明它是隐含的,因为已经有一个为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)) 
+0

感谢Josphpconley。你提供的代码工作,但是,它返回一种类型的字符串,例如“2.00”而不是2.00。在Java中,我可以为Jackson编写一个自定义序列化程序,并用Spring全局注册它。它可以在Scala/Play框架中以相同的方式完成吗? –

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