Добавить пользовательский метод в JsonFormat

#scala #playframework

#scala #playframework

Вопрос:

У меня есть case class со счетом (сумма всех оценок обзора) и количеством (отзывов) отзывов

 case class Rating(score: Long = 0L, count: Int = 0) {
   def total():Long = if (count == 0) 0L else score/count;
}
  

и я хочу поддерживать следующий формат json для сериализации

 {
    "score": 100,
    "count": 11
}
  

и после десериализации

 {
    "score": 100,
    "count": 11,
    "total": 9
}
  

Итак, я хочу вычислить total и отобразить его в десериализованном формате json. В случае Json.format[ClassRating] total будет проигнорировано. Помогите мне, пожалуйста, решить эту проблему

Комментарии:

1. Что вы уже пробовали сами?

Ответ №1:

Я уже решил эту проблему

 case class Rating(score: Long = 0L, count: Int = 0) {
  def total: Long = if (count == 0) 0L else score / count
}

object Rating {
    def apply(score: Long, count: Int): Rating = new Rating(score, count)
    def unapply(x : Rating): Option[(Long, Int, Long)] = Some(x.score, x.count, x.total)
}

val classRatingReads: Reads[Rating] = (
    (JsPath  "score").read[Long] and
    (JsPath  "count").read[Int]
)(Rating.apply _)

val classRatingWrites: OWrites[Rating] = (
  (JsPath  "score").write[Long] and
  (JsPath  "count").write[Int] and
  (JsPath  "total").write[Long]
)(unlift(ClassRating.unapply))