2015-12-23 3 views
0

Вот мой класс case.Как вернуть 2 десятичные точки для BigDecimal в ответ JSON от Scala/Play Framework

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.

Кто-нибудь, пожалуйста, любезно помогите?

С уважением Tin

+0

'type' является зарезервированным словом в Scala, поэтому ваш пример не будет компилироваться – josephpconley

ответ

0

Может показаться сложнее, но это было бы хорошей идеей, чтобы определить отдельный 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)) 
+0

Спасибо Josphpconley. Тем не менее, код, который вы предоставили, возвращает тип строки, например «2.00» вместо 2.00. В Java я мог написать собственный сериализатор для Jackson и зарегистрировать его глобально с помощью Spring. Можно ли сделать это в Scala/Play Framework? –

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