序列化案例对象扩展特征

时间:2014-06-22 16:38:53

标签: scala serialization playframework-2.0

给定trait ConjunctionANDOR个案例对象子类型:

  trait Conjunction
  case object AND extends Conjunction
  case object OR extends Conjunction

使用Play 2 JSON,我尝试编写以下Writes[Conjunction]

  implicit object ConjunctionWrites extends Writes[Conjunction] {
    implicit val orWrites: Writes[OR] = Json.writes[OR]
    implicit val andWrites: Writes[AND] = Json.writes[AND]

    def writes(c: Conjunction) = c match {
      case a@AND => Json.toJson(a)(andWrites)
      case o@OR => Json.toJson(o)(orWrites)
    }
  }

但我收到了一堆not found: type AND/OR错误。

如何序列化这些case object

1 个答案:

答案 0 :(得分:5)

创建案例对象时,可以使用该名称创建值,但不能创建类型。因此ANDOR不存在类型。如果要引用案例对象的类型,请使用.type,例如AND.type

但是,Json.writes宏仅适用于案例类,而不适用于案例对象。你必须写自己的定义:

implicit object ConjunctionWrites extends Writes[Conjunction] {
  def writes(c: Conjunction) = c match {
    case AND => Json.toJson("AND")
    case OR => Json.toJson("OR")
  }
}