Play框架隐式val Writes [T]应该是什么样的超类型?

时间:2015-03-03 19:32:32

标签: json scala playframework-json

我应该使用什么代替???,以便代码进行检查?或者我还应该做些什么呢?我正在使用Play为类B,C,D生成JSON,它们都扩展了A(Layer),但尝试构建JSON的代码只知道它有A,而不是B,C或D。

class Layer

object Layer {
  implicit val layerWrites = new Writes[Layer] {
    def writes(x: Layer) = x match {
      case a: CloudLayer         => ???
      case b: VerticalVisibility => ???
      case c: SkyClear           => ???
    }
  }
}

case class CloudLayer(coverage: String, base: Int) extends Layer
case class VerticalVisibility(height: Int)         extends Layer
case class SkyClear()                              extends Layer

object CloudLayer {
  implicit val cloudLayerWrites = new Writes[CloudLayer] {
    def writes(x: CloudLayer) = Json.obj(
      "layerType" -> "cloudLayer",
      "coverage" -> x.cloudCoverage,
      "base" -> x.base * 100
    )
  }
}

object VerticalVisibility {
  implicit val verticalVisibilityWrites = new Writes[VerticalVisibility] {
    def writes(x: VerticalVisibility) = Json.obj(
      "layerType" -> "verticalVisibility",
      "height" -> x.height * 100
    )
  }
}

object SkyClear {
  implicit val skyClearWrites = new Writes[SkyClear] {
    def writes(x: SkyClear) = Json.obj( "layerType" -> "skyClear" )
  }
}

1 个答案:

答案 0 :(得分:1)

最简单的解决方案是从子类中的实例中删除implicit修饰符,然后显式引用它们:

object Layer {
  implicit val layerWrites = new Writes[Layer] {
    def writes(x: Layer) = x match {
      case a: CloudLayer         => CloudLayer.cloudLayerWrites.writes(a)
      case b: VerticalVisibility =>
        VerticalVisibility.verticalVisibilityWrites.writes(b)
      case c: SkyClear           => SkyClear.skyClearWrites.writes(c)
    }
  }
}

您也可以废弃单个实例并将其内容移动到模式匹配中。

如果你喜欢冒险,Julien Richard-Foy有一个pretty neat enhanced version of the Json.writes, etc. macros,它适用于密封型层次结构。