繁体   English   中英

播放2.1 Json特质序列化

[英]Play 2.1 Json serialization of traits

Play 2.1(Json.format [...])中的实验性“ Inception”功能仅适用于案例类(请参见此处 )。 如何写隐含特征的自定义格式。 我有以下构造:

sealed trait Plan {
  def id: String
  def name: String
  def apps: Int
  def users: Int
  def testruns: Int
  def price: Int
  def prio: Int
}

以下是扩展特征计划的案例类。

case class Start(
                  id: String = "start",
                  name: String = "Start",
                  apps: Int = 1,
                  users: Int = 1,
                  testruns: Int = 10,
                  price: Int = 99,
                  prio: Int = 30) extends Plan

case class Pro(
                id: String = "pro",
                name: String = "Pro",
                apps: Int = 2,
                users: Int = 5,
                testruns: Int = 25,
                price: Int = 299,
                prio: Int = 20) extends Plan

case class Premium(
                    id: String = "premium",
                    name: String = "Premium",
                    apps: Int = -1,
                    users: Int = -1,
                    testruns: Int = -1,
                    price: Int = 799,
                    prio: Int = 10) extends Plan

现在,我需要在“计划”伴随对象中编写我的自定义隐式格式val。 我试过了:

object Plan {
  implicit val planFormats = (
    (__ \ "id").format[String] and
    (__ \ "name").format[String] and
    (__ \ "apps").format[Int] and
    (__ \ "users").format[Int] and
    (__ \ "testruns").format[Int] and
    (__ \ "price").format[Int] and
    (__ \ "prio").format[Int]
  )(Plan.apply, unlift(Plan.unapply))
}

但是,特征没有适用或不适用的方法。 在Play 2.1中为json序列化提供隐式val的正确方法是什么?

您只需要提供自己的函数即可根据给定的值创建一个新实例。

本质上,它是充当工厂的特性的同伴对象。

object Plan {
  def apply(id: String, name: String, ...) = id match {
    case "pro" => new Pro(id, name, ...)
    ...
  }

  def unapply(p: Person): Option[(String, String, ...)] = ...
}

为什么要使用Traits并实现case类?

为什么不使用类的实例,例如:

case class Plan (
  id: String,
  name: String,
  apps: Int,
  users: Int,
  testruns: Int,
  price: Int,
  prio: Int
)

val start = new Plan("start", "Start", 1, 1, 10, 99, 30)
val pro = new Plan("pro", "Pro", 2, 5, 25, 299, 20)
val premium = new Plan("premium", "Premium", -1, -1, -1, 799, 10)

然后,您可以保留Json格式化程序:

object Plan {
  implicit val planFormats = (
    (__ \ "id").format[String] and
    (__ \ "name").format[String] and
    (__ \ "apps").format[Int] and
    (__ \ "users").format[Int] and
    (__ \ "testruns").format[Int] and
    (__ \ "price").format[Int] and
    (__ \ "prio").format[Int]
  )(Plan.apply, unlift(Plan.unapply))
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM