首页 > 解决方案 > 将自定义方法添加到 JsonFormat

问题描述

我有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会被忽略。请帮我解决这个问题

标签: scalaplayframework

解决方案


我已经解决了这个问题

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

推荐阅读